我想在项目中使用信号量,但我被困在这里。我写了三个程序,用于在所有三个程序的关键区域打印语句,以查看信号量如何进行同步。没有输出,程序进入睡眠状态。这是代码 -
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。
答案 0 :(得分:1)
根据您的代码sem[0]
代表"发布id = 0&#34的信号量;并且sem[1]
表示"等待id = 0"的信号量。通过做
semctl(kk,0,SETVAL);
semop(kk,&sem[0],1);
您正在尝试使用值0等待信号量。进行此操作将等到信号量的值大于0,在您的情况下永远不会为真。做
union semun semopts;
semopts.val = 1;
semctl(kk,0,SETVAL, semopts);
在第一次使用信号量之前,应该解决您的问题。