【发布时间】:2018-04-13 19:21:02
【问题描述】:
semget() 函数用于创建信号量集。它需要三个参数:
- 信号量的键值。
- 集合中的信号量数。
- 标志值。它决定创建信号量的访问权限和约束。
在代码中,标志被选择为零,如下所示:
semget(semid, 1, 0);
选择标志值为零是什么意思?我搜索了它,但我找不到答案。有谁知道是什么意思吗?
【问题讨论】:
标签: c system-calls semaphore
semget() 函数用于创建信号量集。它需要三个参数:
在代码中,标志被选择为零,如下所示:
semget(semid, 1, 0);
选择标志值为零是什么意思?我搜索了它,但我找不到答案。有谁知道是什么意思吗?
【问题讨论】:
标签: c system-calls semaphore
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 参数。
【讨论】:
如果标志值为零,则调用正在用于获取现有集合的 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.
【讨论】: