Apple představil nový iPad mini, iMac s čipem M6, 14palcový MacBook Pro s čipem M6 a MacBook Pro s PROLED XDR displejem – první Mac s dotykovým ovládáním.
Nedávno představený projekt mapSTL.com řeší budoucnost. 𝕏: "Netušil jsem, kolik patentů na generování map existuje. Existují patenty na generování fantasy map 🫣. Cokoliv je na 3D tiskárnu a tvoří to produkt, bude to mít patenty. Tak bacha na to!" … více »
Multiplatformní emulátor terminálu Ghostty byl vydán ve verzi 1.4 (𝕏). Přehled novinek a vylepšení v poznámkách k vydání.
Byla objevena zranitelnost Tailworm v Tailscale a Headscale umožňující lokální eskalaci práv přihlášeného uživatele. Následně byla v Tailscale v opravené verzi 1.104.4+ změněna architektura aplikace. Viz příspěvek na blogu Tailscale.
Byl vydán Mozilla Firefox 159.0. Přehled novinek v poznámkách k vydání a poznámkách k vydání pro vývojáře. Řešeny jsou rovněž bezpečnostní chyby. Nový Firefox 159 bude brzy k dispozici také na Flathubu a Snapcraftu.
Nasazení softwaru, který nyní používá ve svých autech pro čínský trh, zvažuje automobilový koncern Volkswagen také v Evropě, kde by se mohl používat v budoucích vozech značek Volkswagen, Škoda a Cupra. Základem pro budoucí evropské modely by se mohla stát takzvaná China Electronic Architecture, elektronická architektura vyvinutá pro čínské modely ve spolupráci s tamní automobilkou Xpeng.
Vedoucím brněnské pobočky Red Hatu se stal Radek Vokál [LinkedIn].
Open source download manager Fatrat povstal z popela. Autor k dvacetiletému výročí projektu přidal do vínku podporu nejnovější knihovny libtorrent, rozhraní portoval na QT6, došlo k nahrazení podpory java rozšíření pythonem. Webové rozhraní bylo přepsáno s podporou mobilních zařízení. Aplikaci je taktéž možno zkompilovat bez podpory GUI. Více informací v releases.
Zranitelnost Broccoli2Shell (CVE-2026-111497) v kompresní knihovně Brotli se netýká pouze Node.js. Ohroženy jsou také aplikace využívající HTTP. Knihovnu používají webové prohlížeče, servery i řada dalších aplikací a technologií, například také Python nebo Bun. Identifikace všech zranitelných komponent může být obtížná, protože knihovna bývá součástí dalších softwarových balíčků nebo je přímo začleněna do spustitelných souborů aplikací.
Quad9, švýcarský celosvětově působící neziskový poskytovatel DNS, od 24. listopadu 2026 ukončí své služby ve Francii kvůli soudnímu sporu s katarskou televizní stanicí beIN. Ta požadovala blokování domén, které podle ní nelegálně zpřístupňují sportovní přenosy. Francouzský soud Katarům vyhověl a nařídil (🇫🇷, PDF) Quad9 blokaci zavést, pod hrozbou pokuty 1000 eur denně. Provozovatel příkaz odmítá s tím, že blokace
… více »Ahoj potřeboval bych od Vás opět poradit, problém se týká synchronizace. Svůj program jsem aplikoval na problematiku 5 filozofů, ale mám pocit, že dochází k deathlock a starvation. Předem Vám děkuji, za odpovědi.
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <time.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <sys/ipc.h>
#include "semun.h"
#define N 5
#define LEFT ((philosopherNumb - 1 + N) % N)
#define RIGHT ((philosopherNumb + 1) % N)
#define LOCK (N+1)
int setSemValue(void);
int delSemaphore(void);
int waitTime(void);
int think(void);
int eat(void);
int zpracujParametr(char *arg, int pocetArg);
int downSemaphore(int philosopherNumb);
int upSemaphore(int philosopherNumb);
int philosopher(int philosopherNumb);
void takeForks(int philosopherNumb);
void putForks(int philosopherNumb);
void testPhilosopher(int philosopherNumb);
enum STATE {thinking, hungry, eating};
char *state;
int semId;
int shmId;
//struct semData
//{
// int semId;
//} SEM_DATA;
struct shmData
{
int count;
} SHM_DATA;
int main(int argc, char *argv[])
{
struct shmData *sharedData;
pid_t pid;
pid_t children[N];
int i = 0;
int retCode = 0;
//int shmId = 0;
int stepsNumber = 0;
void *sharedMemory = (void *) 0;
// Overovani parametru
if ((stepsNumber = zpracujParametr(argv[1], argc)) == -1)
{
fprintf(stderr, "Failed...\n");
exit(EXIT_FAILURE);
}
// Inicializace sdilene pameti
if ((shmId = shmget(IPC_PRIVATE, N + 1, 0666 | IPC_CREAT)) == -1)
{
fprintf(stderr, "Failed...\n");
exit(EXIT_FAILURE);
}
// Zpristupneni sdilene pameti programu
if ((sharedMemory = shmat(shmId, (void *) 0, 0)) == (void*) -1)
{
fprintf(stderr, "Failed...\n");
exit(EXIT_FAILURE);
}
// Inicializace citace akci
sharedData = (struct shmData *) sharedMemory;
sharedData->count=0;
// Odpojeni sdilene pameti
if (shmdt(sharedMemory) == -1)
{
fprintf(stderr, "Failed...\n");
exit(EXIT_FAILURE);
}
// Inicializace semaforu
if ((semId = semget(IPC_PRIVATE, N + 1, 0666 | IPC_CREAT)) == -1)
{
fprintf(stderr, "Failed...\n");
exit(EXIT_FAILURE);
}
// Zpristupneni semaforu
setSemValue();
// Zpristupneni sdilene pameti programu
if ((state = shmat(shmId, (void *) 0, 0)) == (void*) -1)
{
fprintf(stderr, "Failed...\n");
exit(EXIT_FAILURE);
}
// Vytvoreni podprocesu
for (; i < N; i++)
{
pid = fork();
switch (pid)
{
case -1:
fprintf(stderr, "Failed...\n");
exit(EXIT_FAILURE);
break;
case 0:
while (stepsNumber != 0)
{
setbuf(stdout,NULL);
philosopher(i);
stepsNumber--;
}
exit(EXIT_SUCCESS);
break;
default:
children[i] = pid;
break;
}
}
// Ukonceni potomknu;
for (i = 0; i < N; i++)
{
retCode = waitpid(children[i], NULL, 0);
if (retCode < 0)
{
retCode = kill(children[i], SIGTERM);
if (retCode == -1)
{
fprintf(stderr, "Failed...\n");
exit(EXIT_FAILURE);
}
}
}
// Odpojeni sdilene pameti
if (shmdt(state) == -1)
{
fprintf(stderr, "Failed...\n");
exit(EXIT_FAILURE);
}
// Uvolneni sdilene pameti
if (shmctl(shmId, IPC_RMID, 0) == -1)
{
fprintf(stderr, "Failed...\n");
exit(EXIT_FAILURE);
}
// Uvolneni semaforu
if (delSemaphore() == -1)
{
fprintf(stderr, "Failed...\n");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
int zpracujParametr(char *arg, int pocetArg)
{
char *chyba;
int errCode = 0;
int cislo = 0;
errno = 0;
// V parametru je obsazen nepripustny pocet parametru nebo neni obsazen zadny parametr.
if ((pocetArg > 2) || (pocetArg == 1))
{
return -1;
}
cislo = strtol(arg, &chyba, 10);
errCode = errno;
// Parametr obsahuje nepripustne hodnoty.
if (errCode != 0)
{
return -1;
}
// Parametr obsahuje neciselne znaky.
if (*chyba != '\0')
{
return -1;
}
// Parametr obsahuje zapornou hodnotu.
if (cislo < 0)
{
return -1;
}
return cislo;
}
int waitTime(void)
{
int pauseTime = 0;
int retCode = 0;
int errCode = 0;
// Generovani nahodneho cisla v rozmezi O-100.
srand((unsigned int) time(NULL) + (unsigned int) getpid());
pauseTime = rand() % 101;
retCode = usleep(pauseTime);
errCode = errno;
// Chybne skonceni funkce.
if (retCode != 0)
{
return -1;
}
// Chybne skonceni funkce.
if (errCode != 0)
{
return -1;
}
return 0;
}
int think(void)
{
waitTime();
return 0;
}
int eat(void)
{
waitTime();
return 2;
}
int setSemValue(void)
{
union semun semUnion;
semUnion.val = 0;
int i = 0;
for (; i < N + 1; i++)
{
if (semctl(semId, i, SETVAL, semUnion) == -1)
{
return -1;
}
}
return 0;
}
int delSemaphore(void)
{
union semun semUnion;
if (semctl(semId, 0, IPC_RMID, semUnion) == -1)
{
return -1;
}
return 0;
}
int downSemaphore(int philosopherNumb)
{
struct sembuf sem;
sem.sem_num = philosopherNumb;
sem.sem_op = -1;
sem.sem_flg = 0;
if (semop(semId, &sem, 1) == -1)
{
return -1;
}
return 0;
}
int upSemaphore(int philosopherNumb)
{
struct sembuf sem;
sem.sem_num = philosopherNumb;
sem.sem_op = 1;
sem.sem_flg = 0;
if (semop(semId, &sem, 1) == -1)
{
return -1;
}
return 0;
}
void takeForks(int philosopherNumb)
{
downSemaphore(LOCK);
state[philosopherNumb] = hungry;
testPhilosopher(philosopherNumb);
upSemaphore(LOCK);
downSemaphore(philosopherNumb);
}
void putForks(int philosopherNumb)
{
downSemaphore(LOCK);
state[philosopherNumb] = thinking;
testPhilosopher(LEFT);
testPhilosopher(RIGHT);
upSemaphore(LOCK);
}
void testPhilosopher(int philosopherNumb)
{
if (state[philosopherNumb] == hungry && state[LEFT] != eating && state[RIGHT] != eating)
{
state[philosopherNumb] = eating;
upSemaphore(philosopherNumb);
}
}
int philosopher(int philosopherNumb)
{
state[philosopherNumb] = thinking;
printf("F(%d) Mysli\n", philosopherNumb);
think();
printf("F(%d) Bere vidlicky\n", philosopherNumb);
takeForks(philosopherNumb);
printf("F(%d) Ji\n", philosopherNumb);
eat();
printf("F(%d) Poklada vidlicky\n", philosopherNumb);
putForks(philosopherNumb);
return 0;
}
-------------------------semun.h------------------------------------------------------------
#if defined(__GNU_LIBRARY__) && !defined(_SEM_SEMUN_UNDEFINED)
#else
union semun
{
int val;
struct semid_ds *buf;
unsigned short int *array;
struct seminfo *__buf;
};
#endif
To neni moc dobre polozena otazka. Pastnout sem kod a cekat. Spis by to asi chtelo zkusit rozvinout nejake podezreni, kde by mohl byt problem. A cekat potvrzeni nebo vyvraceni myslenky.
"Je to spatne" je asi malo.
ps - hovorime obvykle o "deadlock" nikoliv "deathlock"
Chyba je ve výpise, že například dokáže jíst filozof, který nemá k dispozici vidličky.Skutečně je to tak? Mě přijde, že je to celý tak divoké, že i ten výstup může být jen zmatený. Zkuste spustit
strace -f -o logfile programa pokud si budete myslet, že k chybě došlo, postněte sem logfile jako přílohu. Jinak k vyhladovění ve vašem řešení dojít může.
Tiskni
Sdílej: