semctl 子例程
用途
控制信号量操作。
库
标准 C 库 (libc.a)
语法
#include <sys/sem.h>
int semctl (SemaphoreID, SemaphoreNumber, Command, arg)
OR
int semctl (SemaphoreID, SemaphoreNumber, Command)
int SemaphoreID;
int SemaphoreNumber;
int Command;
union semun {
int val;
struct semid_ds *buf;
unsigned short *array;
} arg;
如果所请求的操作需要第四个自变量,那么该自变量必须为 union semun 类型并显式声明,如上所示。
int semctl (SemaphoreID, SemaphoreNumber, Command, arg)
OR
int semctl (SemaphoreID, SemaphoreNumber, Command)
int SemaphoreID;
int SemaphoreNumber;
int Command;
union semun {
int val;
struct semid_ds *buf;
unsigned short *array;
} arg;
描述
semctl 子例程执行由 Command 参数指定的各种信号量控制操作。 有关信号量限制的信息,请参阅: 进程间通信限制。
参数
- SemaphoreID
- 指定信号量标识。
- SemaphoreNumber
- 指定信号量编号。
- arg.val
- 指定 SETVAL 命令的信号量值。
- arg.buf
- 指定 IPC_STAT 和 IPC_SET 命令的状态信息缓冲区。
- arg.array
- 指定 GETALL 和 SETALL 命令的集合中所有信号量的值。
- 命令
- 指定信号量控制操作。
对于由 SemaphoreID 和 SemaphoreNumber 参数指定的信号量,将执行以下 Command 参数值。 这些操作获取并设置 sem 结构的值,该结构在 sys/sem.h 文件中定义。
- GETVAL
- 如果当前进程具有读许可权,那么返回 semval 值。
- SETVAL
- 如果当前进程具有写许可权,请将 semval 值设置为 arg.val 参数指定的值。 成功执行此 Command 参数时,将在所有进程中清除与指定信号量对应的 semadj 值。
- getpid
- 返回sempid字段,如果当前进程具有读许可权。
- GETNCNT
- 返回semncnt字段,如果当前进程具有读许可权。
- GETZCNT
- 返回semzcnt字段,如果当前进程具有读许可权。
以下 Command 参数值将返回并设置信号集内的每个 semval 值。 这些操作获取并设置 sem 结构的值,该结构在 sys/sem.h 文件中定义。
- 获取
- 如果当前进程具有读许可权,那么将 semvals 值存储到 arg.array 参数指向的数组中。
- 设置
- 如果当前进程具有写许可权,那么根据 arg.array 参数指向的数组设置 semvals 值。 成功执行此 Command 参数时,将在所有进程中清除对应于每个指定信号量的 semadj 值。
以下 Commands 参数值获取并设置 sys/sem.h 文件中定义的 semid_ds 结构的值。 这些操作获取并设置 sem 结构的值,该结构在 sys/sem.h 文件中定义。
- IPC_STAT
- 获取有关 SemaphoreID 参数所标识的信号量的状态信息。 此信息存储在 arg.buf 参数指向的区域中。
- IPC_SET
- 设置拥有的用户和组标识,以及与 SemaphoreID 参数关联的信号集的访问许可权。 IPC_SET 操作使用在 arg.buf 参数结构中找到的值作为输入。IPC_SET 设置以下字段:
项 描述 sem_perm.uid 所有者的用户标识 sem_perm.gid 所有者的组标识 sem_perm.mode 仅许可权位 sem_perm.cuid 创建者的用户标识 IPC_SET 只能由具有 root 用户权限或有效用户标识等于以下值的进程执行:sem_perm.uid或sem_perm.cuid与 SemaphoreID 参数关联的数据结构中的字段。
- IPC_RMID
- 从系统中除去由 SemaphoreID 参数指定的信号量标识,并销毁与其关联的信号量集合和数据结构。 此 Command 参数只能由具有 root 用户权限或有效用户标识等于以下值的进程执行:sem_perm.uid或sem_perm.cuid与 SemaphoreID 参数关联的数据结构中的字段。
返回值
成功完成时,返回的值取决于 Command 参数,如下所示:
| 命令 | 返回值 |
|---|---|
| GETVAL | 返回semval。 |
| getpid | 返回sempid。 |
| GETNCNT | 返回semncnt。 |
| GETZCNT | 返回semzcnt。 |
| 所有其他企业 | 返回值 0。 |
如果semctl子程序不成功,则返回值为-1,并设置全局变量 errno来指示错误。
错误代码
如果下列任何一项为真,那么 semctl 子例程不成功:
| 项 | 描述 |
|---|---|
| EINVAL | SemaphoreID 参数不是有效的信号量标识。 |
| EINVAL | SemaphoreNumber 参数小于 0 或大于或等于 sem_nsems 值。 |
| EINVAL | Command 参数不是有效的命令。 |
| EACCES | 拒绝调用进程对指定操作的许可权。 |
| ERANGE | Command 参数等于 SETVAL 或 SETALL 值,要将 semval 值设置为的值大于系统施加的最大值。 |
| EPERM | Command 参数等于 IPC_RMID 或 IPC_SET 值,并且调用进程没有 root 用户权限或有效用户标识等于sem_perm.uid或sem_perm.cuid与 SemaphoreID 参数关联的数据结构中的字段。 |
| Efault | arg.buf 或 arg.array 参数点位于进程的已分配地址空间外部。 |
| ENOMEM | 系统没有足够的内存来完成子例程。 |