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


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


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

semget(semid, 1, 0);


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

最佳答案

IBM zOS docs描述如下:


  当semflg等于0时,适用以下条件:
  
  
  如果是信号灯标识符
  早已使用键创建,并且的调用过程
  此semget()对其具有读和/或写权限,然后semget()
  返回相关的信号量标识符。
  如果是信号灯标识符
  早已使用键创建,并且的调用过程
  此semget()没有对其的读取和/或写入权限,然后
  semget()返回-1,并将errno设置为EACCES。
  如果是信号灯标识符
  之前未使用密钥创建过,则semget()返回-1,
  将errno设置为ENOENT。
  


也许有人会大声疾呼zOS,但是文档写了以下内容:

#define _XOPEN_SOURCE # POSIX
#include <sys/sem.h>

int semget(key_t key, int nsems, int semflg);


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

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参数。

关于c - semget()函数的标志值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49833569/

10-13 05:25