Помещение семафора в разделяемую память 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 дети, и это позволило детям получить семафор.

Другие вопросы по тегам