我使用semget()来获取信号量,并将其初始化为0,然后我想用semop()等它,但它会直接返回。 (另一个过程旨在获取SEM并在某些操作后释放它)
但是如果我得到一个SEM并在一个过程中将其初始化为0,并在另一个过程中等待它,那么它就可以了。
这是否意味着一个过程无法阻止自己?
感谢!!!
像这样:int semid = semget(IPC_PRIVATE, 1, IPC_CREAT);
union semun su;
su.val = 0;
semctl(semid, 1, SETVAL, su);
struct sembuf sb;
sb.sem_num = 0;
sb.sem_op = -1;
sb.sem_flg = 0;
semop(semid, &sb, 1);
答案 0 :(得分:1)
目前我应该看到你应该:
将信号量初始化为1(su.val)
调用semop并将sb.sem_op设置为0(即等待计数器降至零)。
在其他进程中删除计数(sem_op = -1)。
因为你用0初始化信号量并调用它减1(信号量永远不会低于零),你的等待调用将成功,你的进程不会阻塞。 这有帮助吗?
也许这可能会提供额外的见解:
http://linuxdevcenter.com/pub/a/linux/2007/05/24/semaphores-in-linux.html?page=2