我试图了解如何在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");
}
答案 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()
调用,一个递减信号量,那么您的程序可以正常工作,然后一个等待它变为零。