C Unix信号量:进程应该等待0,但不是

时间:2013-11-20 16:35:04

标签: c unix semaphore ipcs

写了两个简单的函数,一个用于将信号量设置为任意值(Reset),另一个用于使进程调用它等待信号量为零:

int R(int semid, int semnum, int val)   // reset
{
    union semun arg;
    arg.val = val;
    if( semctl(sem_id,semnum,SETVAL,arg) == -1 )  
    {
        fprintf (stderr, "Errore inizializzazione del semaforo\n%s\n",
                strerror(errno) );
    }
}

int Z(int semid, int semnum)    // wait for zero
{
        printf("waiting for zero on %d\n",semid);
        struct sembuf cmd;
        cmd.sem_num = semnum;
        cmd.sem_op = 0;
        cmd.sem_flg = 0;
        if(semop(semid, &cmd, 1)<0) {ERROR}
        return 0;
}

将这些函数用作代码的过程如下所示:

while(1) {
    R(sem_id_counter,0,N_PROC_DEFAULT);  // (N_PROC_DEFAULT=5)

    /* list of tasks not having anything to do with sem_id_coutner */

    Z(sem_id_counter,0);
}

上面的过程只是继续执行循环,而我希望它在结束时停止,当它调用函数Z时,等待信号量变为0,然后将其重置为初始内容并重新启动。

我哪里错了?谢谢[解决:愚蠢的错字sem_id而不是semid]

0 个答案:

没有答案