标志semget()函数的值

时间:2018-04-13 19:21:02

标签: c system-calls semaphore

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

  1. 信号量的键值。
  2. 集合中的信号量。
  3. 标志值。它决定了创建信号量的访问权限和约束。
  4. 在代码中,标志被选为零,如下所示:

    semget(semid, 1, 0);
    

    选择标志值为零是什么意思?我搜查了一下,但我找不到答案。有谁知道这意味着什么?

2 个答案:

答案 0 :(得分: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系统支持的X / Open和POSIX标准(Linux,FreeBSD ......)。

摘自&#34; Linux编程接口&#34;作者:Michael Kerrisk(第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参数。

答案 1 :(得分:0)

如果标志值为零,则使用该调用来获取现有集的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.