我在进程A中将信号量(semget + init设置为1)。分叉了A,得到了B。
分叉B并得到C(进程B,C的代码在另一个.c文件中,因此我将semid作为带有extern int semid的全局整数传递)。
在进程C代码中,我尝试应用down(semid)并得到“无效参数”错误。
我在down函数的代码中所做的是这样的:
struct sembuf sem_d;
sem_d.sem_num = 0;
sem_d.sem_op = -1;
sem_d.sem_flg = 0;
if ( semop(semid, &sem_d, 1) == -1 )
{
perror("error with down function");
return -1;
}
我究竟做错了什么?
我还向您保证,初始化信号量时的Semid在semop之前是相同的。
另外,在进程A,B中,我正在使用wait(-1)。
最佳答案
我不确定是否允许在分叉上使用semget()
-毕竟这是一个不同的处理空间。
无论如何,semget()
是旧的System V信号量的一部分。
我建议切换到POSIX semaphores-sem_open()
,sem_wait()
和朋友,并使用命名信号量。然后在每个进程中打开相同的信号灯名称。