semget 子例程
用途
获取一组信号。
库
标准 C 库 (libc.a)
语法
#include <sys/sem.h> int semget (Key, NumberOfSemaphores, SemaphoreFlag)
key_t Key;
int NumberOfSemaphores, SemaphoreFlag;
key_t Key;
int NumberOfSemaphores, SemaphoreFlag;
描述
semget 子例程返回与 Key 参数值相关联的信号量标识。
如果以下条件之一为真,semget子程序就会为信号标识符 ID 创建一个数据结构,并创建一个包含NumberOfSemaphores参数信号标识符的数组:
- Key 参数等于 IPC_PRIVATE 操作。
- Key 参数尚未具有与其关联的信号量标识,并且已设置 IPC_CREAT 值。
创建时,将按如下所示初始化与新信号量标识相关联的数据结构:
- sem_perm.cuid和sem_perm.uid将字段设置为等于调用进程的有效用户标识。
- sem_perm.cgid和sem_perm.gid将字段设置为等于调用进程的有效组标识。
- 低阶 9 位sem_perm.mode字段设置为等于 SemaphoreFlag 参数的低阶 9 位。
- sem_nsems字段的值等于 NumberOfSemaphores参数的值。
- sem_otime字段设置为等于 0 ,并且sem_ctime字段设置为等于当前时间。
未初始化与集合中的每个信号量相关联的数据结构。 可以使用 塞姆特尔 (semctl 子例程) 子例程 (具有 命令 参数值 SETVAL 或 SETALL) 来初始化每个信号量。
如果Key参数值不是IPC_PRIVATE,IPC_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 一个或多个以下值来构造:
以 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_CREAT 和 IPC_EXCL 值。 |
| ENOMEM | 没有足够的内存来完成操作。 |