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/