0

我在进程 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;
}

我究竟做错了什么?

我也确信信号量初始化时的半自动在 semop 之前是相同的。
此外,在进程 A 中,BI 正在使用等待(-1)。

4

1 回答 1

0

我不确定你是否被允许semget()在分叉上使用——毕竟这是一个不同的进程空间。

semget()无论如何,它是旧 System V 信号量的一部分。

我建议切换到POSIX 信号量-sem_open()sem_wait()朋友并使用命名信号量。然后在每个进程中打开相同的信号量名称。

于 2012-12-04T14:21:25.223 回答