2016-08-25 30 views
1

我創建使用semget如何使用了semctl設置第n個信號的值在信號燈設置

#define SEM_ID 250 
... 
sem_set_id = semget(SEM_ID, 1, IPC_CREAT | 0660); 
if (sem_set_id == -1) { 
perror("main: semget"); 
exit(1); 

現在System V信號按我的理解,這將創建一套信號燈其中有許多信號燈在裏面。 但如何識別特定的信號使用semctl將其值設置...

int iter=0; 
for(iter=0;iter<no_of_jobs;iter++) 
{ 
    int rc=semctl(semid,iter,SETVAL, sem_val); 
    if(rc==-1) 
     {printf("Error:semctl\n"); 
     exit(1); 
     } 
} 

上面的代碼運行的iter=0但沒有其他。在struct semun sem_val中,我設置了值sem_val.val=1;

回答

1

semget()的第二個參數是信號集中的信號量數量。你指定了1,所以你得到了一個信號量。訪問除一個信號以外的任何東西都會導致錯誤。

1更改爲10,例如,您應該可以遍歷信號量0..9(含)。

+0

當我更改1到10 semget給出錯誤.... –

+0

行;它給了什麼錯誤?也許你的系統沒有配置爲允許更大的信號集。從2開始,看看它走多遠。內核的配置方式因系統而異;什麼和怎樣的細節非常非常多變。至少,您需要說明您正在使用哪種操作系統(例如Solaris,Mac OS X和Linux的答案完全不同)。 –

+0

在Mac OS X上,一些相關參數是:'kern.sysv.semume = 10', 'kern.sysv.semmsl = 87381', 'kern.sysv.semmnu = 87381', 'kern.sysv .semmns = 87381', 'kern.sysv.semmni = 87381' - 並且命令它們是'sysctl'。 –