2014-07-13 77 views
0

我想在一個項目中使用信號量,但我在這裏卡住了。我寫了三個程序來打印所有三個程序的關鍵區域的語句,以瞭解信號量如何同步。有沒有輸出,並使程序進入睡眠state.Here是代碼 -使用信號燈沒有輸出

int main() 
    { 
     int fd,ret,kk,x=1,y=2; 
     struct sembuf sem[2]={{0,-1,SEM_UNDO}, 
      {0,1,SEM_UNDO}}; 
     union semun a; 
     a.val=1; 
     kk=semget(1234,1,IPC_CREAT); 
     semctl(kk,0,SETVAL); 
     semop(kk,&sem[0],1); 
     printf("In client1...\n"); 
     printf("In client1...\n"); 
     sleep(3); 
     semop(kk,&sem[1],1); 
    } 

我做了這個程序客戶端2 & client3的2份。

回答

1

根據您的代碼sem[0]代表「後信號量id = 0」和sem[1]意思是「等待id = 0的信號量」。通過這樣做

semctl(kk,0,SETVAL); 
semop(kk,&sem[0],1); 

你嘗試在等待信號燈值爲0進程這樣做,會等到信號量的值大於0,而你的情況是不正確的。這樣做

union semun semopts; 
semopts.val = 1; 
semctl(kk,0,SETVAL, semopts); 

使用旗語第一次使用前,應解決您的問題。

+0

這將永遠不會工作,因爲第二個參數是semnum,在我的情況下應該是0,因爲這是該集合的第一個也是唯一的。所以0代表索引。 – Imdad

+0

嗯,我上次使用SysV信號已經有一段時間了。當然,它應該是'union semun semopts; semopts.val = 1; semctl(kk,0,SETVAL,semopts);'我編輯了我的答案。 – norbert108

+0

是的,工作..謝謝! – Imdad