【发布时间】:2015-06-21 21:13:53
【问题描述】:
我正在尝试了解如何在 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");
}
【问题讨论】:
-
我相信这里的问题是你的第一个线程调用
semop()这会将值递减到1,然后等待值变为0,但是直到第一个线程从semop()返回第二个不能输入它以再次减少它。您可能需要将操作分解为多个 semop() 调用。我对此并不积极...我从未使用过 semop(),我只是在阅读手册页。