如您在信号量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/

10-15 16:18