0
我已经设置(+了semget初始化为1)在过程A.叉形甲一个信号量,并得到了B.获得无效的参数从执行semop
叉形B和得到C(流程B的代码,C是在另一个.c文件,所以我使用extern int semid作为全局整数传递semid)。
在进程C代码中,我尝试向下应用(semid)并获取“无效参数”错误。
我为降功能代码正在做的是这样的:
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我使用等待(-1)。
为什么不允许它?会有什么问题? (信号标识是全局变量,在所有分叉调用之前已经使用了semget)。另外,我正在使用semop,而不是semget。 (我们实际上有一个任务,我们必须使用System V信号量:/) – Chris
叉是写时拷贝的。因此,除非信号灯位于保持共享的区域,否则它将在叉上复制并在第一次使用之后使用。那么,它将如何保持同步呢? –
我正在调用任何分支之前获取所有信号量。因此,使用全局变量semid并使用semop对其中的任何一个进行操作都可以正常工作。我发现什么是错的。在子进程退出之前,母进程正在终止。所以我试图操作一个在母亲流程结束时被删除的信号量。我认为,等待(-1)它可以。但它需要等待(NULL)。 – Chris