编程接口指南

控制信号量

semctl(2) 可更改信号量集的权限和其他特性。 必须使用有效的信号量 ID 调用信号量。semnum 值可根据信号量索引选择数组内的信号量。 cmd 参数为以下控制标志之一。

GETVAL

返回单个信号量的值。

SETVAL

设置单个信号量的值。 在这种情况下,arg 被视为 arg.val,其类型为 int

GETPID

返回针对信号量或数组执行上次操作的进程的 PID

GETNCNT

返回等待信号量值增加的进程数。

GETZCNT

返回等待特定信号量的值达到零的进程数。

GETALL

返回信号量集中所有信号量的值。 在这种情况下,arg 被视为 arg.array,即指向数组的指针(值的类型为 unsigned short)。

SETALL

设置信号量集中所有信号量的值。 在这种情况下,arg 被视为 arg.array,即指向数组的指针(值为 unsigned short)。

IPC_STAT

从控制结构中返回信号量集的状态信息,并将其放入 arg.buf(指向类型为 semid_ds 的缓冲区的指针)指向的数据结构中。

IPC_SET

设置有效的用户和组标识以及权限。 在这种情况下,arg 被视为 arg.buf

IPC_RMID

删除指定的信号量集。

进程的属主、创建者或超级用户必须具有有效的用户标识,才能执行 IPC_SETIPC_RMID 命令。 与其他控制命令相同,执行上述两个命令也需要读写权限。

以下代码说明了 semctl(2)

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/sem.h>

...

 	register int				i;

 ...

 	i = semctl(semid, semnum, cmd, arg);

 	if (i == –1) {

 		perror("semctl: semctl failed");

 		exit(1);

...