semget 子例程

用途

获取一组信号。

标准 C 库 (libc.a)

语法

#include <sys/sem.h>
int semget (Key, NumberOfSemaphores, SemaphoreFlag)
key_t  Key;
int  NumberOfSemaphores SemaphoreFlag;

描述

semget 子例程返回与 Key 参数值相关联的信号量标识。

如果以下条件之一为真,semget子程序就会为信号标识符 ID 创建一个数据结构,并创建一个包含NumberOfSemaphores参数信号标识符的数组:

  • Key 参数等于 IPC_PRIVATE 操作。
  • Key 参数尚未具有与其关联的信号量标识,并且已设置 IPC_CREAT 值。

创建时,将按如下所示初始化与新信号量标识相关联的数据结构:

  • sem_perm.cuidsem_perm.uid将字段设置为等于调用进程的有效用户标识。
  • sem_perm.cgidsem_perm.gid将字段设置为等于调用进程的有效组标识。
  • 低阶 9 位sem_perm.mode字段设置为等于 SemaphoreFlag 参数的低阶 9 位。
  • sem_nsems字段的值等于 NumberOfSemaphores参数的值。
  • sem_otime字段设置为等于 0 ,并且sem_ctime字段设置为等于当前时间。

未初始化与集合中的每个信号量相关联的数据结构。 可以使用 塞姆特尔 (semctl 子例程) 子例程 (具有 命令 参数值 SETVALSETALL) 来初始化每个信号量。

如果Key参数值不是IPC_PRIVATEIPC_EXCL值未设置,且指定的Key参数已存在一个 semaphore 标识,NumberOfSemaphores参数值将指定当前进程所需的 semaphores 数量。

如果 "NumberOfSemaphores"参数的值为 0,则可以接受任何数量的 Semaphores。 如果NumberOfSemaphores参数不为 0,则如果集合包含的内容少于NumberOfSemaphores参数的值,semget子程序将无法成功执行。

以下限制适用于信号量:

  • 最大信号量标识数 1048576。
  • 每个标识的最大信号数为 65,535。
  • se拖把 子例程每次调用的最大操作数为 1024。
  • 每个过程的最大撤销条目数为 1024。
  • 最大信号量值为 32,767。
  • 最大退出时调整值为 16,384。

参数

描述
key 指定 IPC_PRIVATE 值或由 ftok 子例程 (或类似算法) 构造的 IPC 密钥。
NumberOfSemaphores 指定集合中的信号数。
SemaphoreFlag 通过逻辑上 ORing 一个或多个以下值来构造:
IPC_CREAT
如果数据结构尚不存在,请创建该数据结构。
IPC_EXCL
如果还设置了 IPC_CREAT 值并且数据结构已存在,那么会导致 semget 子例程失败。
S_IRUSR
允许拥有数据结构的进程读取该数据结构。
S_IWUSR
允许拥有数据结构的进程对其进行修改。
S_IRGRP
允许与数据结构关联的组对其进行读取。
S_IWGRP
允许与数据结构关联的组对其进行修改。
S_IROTH
允许其他用户读取数据结构。
S_IWOTH
允许其他用户修改数据结构。

S_I 前缀开头的值在 sys/mode.h 文件中定义,并且是应用于文件的访问许可权的子集。

返回值

成功完成时, semget 子例程会返回信号量标识。 否则,返回值为-1,并设置errno全局变量来指示错误。

错误代码

如果满足下列一个或多个条件,那么 semget 子例程不成功:

描述
EACCES Key 参数存在信号量标识,但未授予操作许可权 (由 SemaphoreFlag 参数的低阶 9 位指定)。
EINVAL 一个信号标识符不存在,且NumberOfSemaphores参数小于或等于 0,或大于系统规定的值。
EINVAL 参数存在一个信号标识符,但与之相关联的集合中的信号数量少于NumberOfSemaphores参数的值,且NumberOfSemaphores参数不等于 0。
ENOENT Key 参数不存在信号量标识,并且未设置 IPC_CREAT 值。
ENOSPC 创建信号量标识将超过系统范围内允许的最大标识数。
EEXIST Key 参数存在信号量标识,但同时设置了 IPC_CREATIPC_EXCL 值。
ENOMEM 没有足够的内存来完成操作。