2015-03-26 5 views
1

Я пытаюсь сделать семафор видимым для нескольких процессов после форкирования. Это проблема столового философа, использующая разделяемую память и семафор, чтобы гарантировать, что только один философ забирает палочки для еды за один раз (не самый эффективный способ, массив семафоров будет более эффективным, но это не главное). Он переходит к циклу while внутри начала, распечатывая его, но ни один из процессов не вводит оператор if каким-либо процессом. Глобальный охват: int semId;Ввод семафора в общую память C

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 Есть нечто, объявленное на глобальном, что не должно быть, но это будет очищено, как только я получить работу

+0

Ваш код не подлежит компиляции. '' Start() 'принимает параметр' int' или нет? –

+0

@CareyGregory Да, это так, извините, исправлено – CodeMonkey

+1

Семафор начинается со счета 0. Поэтому кто-то должен «semSignal», чтобы получить мяч. Я положил 'semSignal' в' main' после цикла, который 'forks' детей, и это позволило детям получить семафор. – user3386109

ответ

0

Семафор начинается со счета 0. Поэтому кто-то должен semSignal, чтобы получить мяч. Я положил semSignal в main после цикла, который forks детей, и это позволило детям получить семафор.