2016-08-25 44 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'。 –