【问题标题】:Semaphores System V - semop implementation信号量系统 V - semop 实现
【发布时间】:2017-05-14 22:45:14
【问题描述】:

正如您在 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?

【问题讨论】:

    标签: c semaphore


    【解决方案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 为零,则进程必须对 信号量集。这是一个“等待零”操作[...]

    【讨论】:

      猜你喜欢
      • 2020-02-16
      • 2016-07-15
      • 2023-03-21
      • 1970-01-01
      • 2011-08-31
      • 1970-01-01
      • 2011-08-25
      • 1970-01-01
      相关资源
      最近更新 更多