2012-12-03 19 views
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)。

回答

0

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

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

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

+0

为什么不允许它?会有什么问题? (信号标识是全局变量,在所有分叉调用之前已经使用了semget)。另外,我正在使用semop,而不是semget。 (我们实际上有一个任务,我们必须使用System V信号量:/) – Chris

+0

叉是写时拷贝的。因此,除非信号灯位于保持共享的区域,否则它将在叉上复制并在第一次使用之后使用。那么,它将如何保持同步呢? –

+2

我正在调用任何分支之前获取所有信号量。因此,使用全局变量semid并使用semop对其中的任何一个进行操作都可以正常工作。我发现什么是错的。在子进程退出之前,母进程正在终止。所以我试图操作一个在母亲流程结束时被删除的信号量。我认为,等待(-1)它可以。但它需要等待(NULL)。 – Chris