Помещение семафора в разделяемую память C
Я пытаюсь сделать семафор видимым для нескольких процессов после разветвления. Это проблема столового философа, использующего разделяемую память и семафор, чтобы гарантировать, что только один философ собирает палочки для еды за раз (не самый эффективный способ, массив семафоров был бы более эффективным, но это не главное). Он попадает в цикл while внутри запуска, распечатывая введенные данные, но ни один из процессов не вводит оператор if каким-либо процессом. Глобальная сфера:int semId;
Inside my main:
semId=semget(IPC_PRIVATE,1,S_IRUSR|S_IWUSR);
for(int i =0; i<5; i++)
if(fork()==0)
start(i);
void start(int philNo){
struct sembuf semWait[1]={{0,-1,0}};
struct sembuf semSignal[1] = {{0,1,0}};
while(philArr[philNo].stomach<100){
printf("entered while\n");
//see if the semaphore is available
if (semop(semId,semWait,1)==0)
{
printf("semaphore available/n");
}
Полный код доступен здесь: http://pastie.org/10054082 На глобальном уровне объявлены некоторые вещи, которых не должно быть, но которые будут очищены, как только я получу его.
1 ответ
Семафор начинается с нуля. Так что кто-то должен semSignal
чтобы мяч катился. Я положил semSignal
в main
после цикла, который forks
дети, и это позволило детям получить семафор.