gpt4 book ai didi

c - semget() 函数的标志值

转载 作者:行者123 更新时间:2023-11-30 14:49:11 25 4
gpt4 key购买 nike

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

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

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

semget(semid, 1, 0);

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

最佳答案

IBM zOS docs描述一下:

When semflg equals 0, the following applies:

  • If a semaphore identifier has already been created with key earlier, and the calling process of this semget() has read and/or write permissions to it, then semget() returns the associated semaphore identifier.
  • If a semaphore identifier has already been created with key earlier, and the calling process of this semget() does not have read and/or write permissions to it, then semget() returns-1 and sets errno to EACCES.
  • If a semaphore identifier has not been created with key earlier, then semget() returns -1 and sets errno to 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 编程接口(interface)”的摘要(第 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com