信号量unix c等待零

时间:2015-04-15 18:39:04

标签: c unix semaphore ipcs

我试图了解如何在unix中等待零操作。我有这个代码,但它总是停止等待给定的值。

int main(void){

    int sem;
    struct sembuf sops[2];


    if((sem = semget(IPC_PRIVATE, 1,  IPC_CREAT | 0600))==-1){
        perror("Error semget");
        return 100;
    }

    fork();
    //printf("Empieza la accion\n");

    if(semctl(sem,0,SETVAL,2)==-1){
        printf("Error semctl\n");
        exit(100);
    }
    printf("Value: %d\n",semctl(sem,0,GETVAL));
    sops[0].sem_num=0;     
    sops[0].sem_op=-1;     
    sops[0].sem_flg=0;      

    //WAIT(0)   
    sops[1].sem_num=0;     
    sops[1].sem_op=0;     
    sops[1].sem_flg=0;
    printf("Value: %d\n",semctl(sem,0,GETVAL));

    if(semop(sem,&sops,2)<0) printf("Error semop\n");
    printf("Value: %d\n",semctl(sem,0,GETVAL));
    printf("End\n");

}

1 个答案:

答案 0 :(得分:1)

Gcc向我抱怨你的代码:

  

sem.c:37:警告:从不兼容的指针类型传递'semop'的参数2   /usr/include/sys/sem.h:59:注意:预期'struct sembuf *'但参数类型为'struct sembuf(*)[2]'

这是它不喜欢的代码:

    if(semop(sem,&sops,2)<0) printf("Error semop\n");

如果我将其更改为

    if(semop(sem,sops,2)<0) printf("Error semop\n");

然后GCC不会抱怨,并且该节目无限期地挂在semop()电话上,正如我所料。

特别要注意semop()将所有指定的操作作为原子组应用,或者根本不应用。如果两个进程指定的操作重叠,那么你的程序只能继续semop()调用,这样两个减量首先执行,然后是两个等待零。

如果我在SETVAL调用之前移动fork()操作,并且让每个进程执行两个单独的semop()调用,一个递减信号量,那么您的程序可以正常工作,然后一个等待它变为零。