【问题标题】:Flag Value of semget() functionsemget() 函数的标志值
【发布时间】:2018-04-13 19:21:02
【问题描述】:

semget() 函数用于创建信号量集。它需要三个参数:

  1. 信号量的键值。
  2. 集合中的信号量数。
  3. 标志值。它决定创建信号量的访问权限和约束。

在代码中,标志被选择为零,如下所示:

semget(semid, 1, 0);

选择标志值为零是什么意思?我搜索了它,但我找不到答案。有谁知道是什么意思吗?

【问题讨论】:

    标签: c system-calls semaphore


    【解决方案1】:

    IBM zOS docs 对此进行描述:

    当 semflg 等于 0 时,以下情况适用:

    • 如果是信号量标识符 之前已经用key创建好了,调用过程 此 semget() 对其具有读取和/或写入权限,然后 semget() 返回相关的信号量标识符。
    • 如果是信号量标识符 之前已经用key创建好了,调用过程 这个 semget() 没有读和/或写权限,那么 semget() 返回-1 并将 errno 设置为 EACCES。
    • 如果是信号量标识符 之前没有使用 key 创建,然后 semget() 返回 -1 并且 将 errno 设置为 ENOENT。

    也许有些人会对 zOS 大声疾呼,但文档会写如下:

    #define _XOPEN_SOURCE # POSIX 
    #include <sys/sem.h>
    
    int semget(key_t key, int nsems, int semflg);
    

    _XOPEN_SOURCE 表示支持大多数类 UNIX 系统(Linux、FreeBSD ...)支持的 X/Open 和 POSIX 标准。

    Michael Kerrisk 的“Linux 编程接口”摘要(第 928 页)。我会写msgget(获取IPC消息队列标识符。信号量flag参数的行为是相同的)在源代码中。

    假设我们需要一个消息队列用于两个或多个用户进程之间的 IPC。同一组中的所有用户。一位用户创建了消息队列:

    msgget(key, IPC_CREAT | S_IRUSR | S_IWUSR | S_IRGRP);
                          /* rw-r----- */
    

    同一组的另一个用户尝试以相同方式获取此消息的标识符将失败:

    msgget(key, S_IRUSR | S_IWUSR);
    

    因为另一个用户没有对该队列的写入权限,因为他没有创建队列。

    解决方法 是存在的,它会将 0 传递给 flag 参数。

    【讨论】:

      【解决方案2】:

      如果标志值为零,则调用正在用于获取现有集合的 ID。至少在 Linux 上,手册页可以使这一点更加明显。我刚刚解决了这个问题,所以手册页现在显示:

         The  semget() system call returns the System V semaphore set iden‐
         tifier associated with the argument key.  It may be used either to
         obtain  the identifier of a previously created set (when semflg is
         zero and key does not have the value IPC_PRIVATE), or to create  a
         new set.
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-06
        • 2011-04-05
        • 1970-01-01
        • 1970-01-01
        • 2013-02-28
        • 1970-01-01
        • 2017-01-18
        • 1970-01-01
        相关资源
        最近更新 更多