semget()
函数用于创建信号量集。它需要三个参数:
在代码中,标志被选为零,如下所示:
semget(semid, 1, 0);
选择标志值为零是什么意思?我搜查了一下,但我找不到答案。有谁知道这意味着什么?
答案 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.