Synchronization 使用信号量时没有输出

Synchronization 使用信号量时没有输出,synchronization,semaphore,Synchronization,Semaphore,我想在一个项目中使用信号量,但我被困在这里了。我编写了三个程序,在所有三个程序的关键区域打印一条语句,以了解信号量是如何进行同步的。没有输出,程序进入睡眠状态- int main() { int fd,ret,kk,x=1,y=2; struct sembuf sem[2]={{0,-1,SEM_UNDO}, {0,1,SEM_UNDO}}; union semun a; a.val=1;

我想在一个项目中使用信号量,但我被困在这里了。我编写了三个程序,在所有三个程序的关键区域打印一条语句,以了解信号量是如何进行同步的。没有输出,程序进入睡眠状态-

    int main()
    {
        int fd,ret,kk,x=1,y=2;
        struct sembuf sem[2]={{0,-1,SEM_UNDO},
            {0,1,SEM_UNDO}};
        union semun a;
        a.val=1;
        kk=semget(1234,1,IPC_CREAT);
        semctl(kk,0,SETVAL);
        semop(kk,&sem[0],1);
        printf("In client1...\n");
        printf("In client1...\n");
        sleep(3);
        semop(kk,&sem[1],1);
    }

我复制了2份这个程序client2和client3。

根据你的代码
sem[0]
代表“post-semaphore of id=0”,而
sem[1]
代表“wait-on-semaphore of id=0”。通过做

semctl(kk,0,SETVAL);
semop(kk,&sem[0],1);
您正在尝试等待值为0的信号量。这样做的进程将等待信号量的值大于0,在您的情况下,这永远不会为真。做

union semun semopts;
semopts.val = 1; 
semctl(kk,0,SETVAL, semopts);

在第一次使用信号量之前,应该解决您的问题。

这永远不会起作用,因为第二个参数是semnum,在我的例子中,它应该是0,因为这是集合的第一个&唯一一个。所以0代表索引。自从我上次使用SysV信号量以来,已经有一段时间了。当然应该是
union-semun-semopts;semopts.val=1;semctl(kk,0,SETVAL,semopts)我编辑了我的答案。