我在进程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()和朋友,并使用命名信号量。然后在每个进程中打开相同的信号灯名称。

09-06 21:33