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 类型并显式声明,如上所示。

描述

semctl 子例程执行由 Command 参数指定的各种信号量控制操作。 有关信号量限制的信息,请参阅: 进程间通信限制

参数

SemaphoreID
指定信号量标识。
SemaphoreNumber
指定信号量编号。
arg.val
指定 SETVAL 命令的信号量值。
arg.buf
指定 IPC_STATIPC_SET 命令的状态信息缓冲区。
arg.array
指定 GETALLSETALL 命令的集合中所有信号量的值。
命令
指定信号量控制操作。

对于由 SemaphoreIDSemaphoreNumber 参数指定的信号量,将执行以下 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.uidsem_perm.cuidSemaphoreID 参数关联的数据结构中的字段。

IPC_RMID
从系统中除去由 SemaphoreID 参数指定的信号量标识,并销毁与其关联的信号量集合和数据结构。 此 Command 参数只能由具有 root 用户权限或有效用户标识等于以下值的进程执行:sem_perm.uidsem_perm.cuidSemaphoreID 参数关联的数据结构中的字段。

返回值

成功完成时,返回的值取决于 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.uidsem_perm.cuid SemaphoreID 参数关联的数据结构中的字段。
Efault arg.bufarg.array 参数点位于进程的已分配地址空间外部。
ENOMEM 系统没有足够的内存来完成子例程。