如您在信号量System V文档(http://man7.org/linux/man-pages/man2/semop.2.html)中所见,有一部分陈述了以下内容:
例
以下代码段使用semop()原子地等待
信号量0的值变为零,然后递增信号量
值一。
struct sembuf sops[2];
int semid;
/* Code to set semid omitted */
sops[0].sem_num = 0; /* Operate on semaphore 0 */
sops[0].sem_op = 0; /* Wait for value to equal 0 */
sops[0].sem_flg = 0;
sops[1].sem_num = 0; /* Operate on semaphore 0 */
sops[1].sem_op = 1; /* Increment value by one */
sops[1].sem_flg = 0;
if (semop(semid, sops, 2) == -1) {
perror("semop");
exit(EXIT_FAILURE);
}
在此示例之后,我有几个问题:
1-
(semop(semid, sops, 2) == -1)
是否执行2个sops位置? sops [0]和sops [1]?2-如果是,为什么
sops[0].sem_op = 0;
等待Semid的值等于0? 最佳答案
1-(semop(semid,sops,2)== -1)是否执行2个sops位置? sops [0]和sops [1]?
它会尝试这样做,是的。这就是semop()
函数的作用,必须运行它才能返回一个值(示例代码随后针对-1测试)。与许多C函数一样,semop()
失败时返回-1;在这种情况下,对于该功能,您可以不执行任何操作。否则,semop()
返回0,在这种情况下,您可以依赖已执行的两个操作。
2-如果是,为什么sops [0] .sem_op = 0;等待semid的值等于0?
因为这就是sem_op
的值定义的意思。正如您自己链接的文档所述:
如果sem_op
为零,则该进程必须具有对
信号量集。这是一个“等待零”操作[...]
关于c - 信号量系统V-样本实现,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41399511/