信号量系统V - semop实现

时间:2016-12-30 16:32:56

标签: c semaphore

正如您在信号量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 个答案:

答案 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为零,则该进程必须具有读取权限          信号量集。这是一个“等待零”操作[...]