正如您在信号量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?
答案 0 :(得分:1)
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
为零,则该进程必须具有读取权限 信号量集。这是一个“等待零”操作[...]