|
使用信号量时,往往需要对信号集进行一些控制操作,比如删除信号集,对内核维护的信号集的数据结构 semid_ds 进行设置、获取信号集中信号值等。通过 semctl() 函数可以完成这些操作,该函数定义在 sys/sem.h 中,如下所示:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int semctl(int semid, int semnum, int cmd, ...);
参数 semid 为信号集的标识符;
参数 semnum 标识一个特定的信号;
参数 cmd 指明控制操作的类型;
"...." 说明函数的参数是可选的,它依赖于第三个参数 cmd ,它通过共用体变量 semun 选择要操作的参数。
semnun 定义如下:
/* arg for semctl system calls. */
union semun {
int val; /* value for SETVAL */
struct semid_ds *buf; /* buffer for IPC_STAT & IPC_SET */
unsigned short *array; /* array for GETALL & SETALL */
struct seminfo *__buf; /* buffer for IPC_INFO */
void *__pad;
}; 各字段含义如下:
val : 用于 SETVAL 操作类型,设置某个信号的值等于 val 。 buf : 用于 IPC_STAT 和 IPC_SET 操作,存取 semid_ds 结构。 array : 用于 SETALL 和 GETALL 操作。 __buf : 为控制 IPC_INFO 提供的缓存。 参数 cmd ,通过宏来指示操作类型,可取的各个宏含义如下:
IPC_STAT : 通过 semun 结构体的 buf 参数返回当前的 semid_ds 结构体。注意,调用前必须首先分配一个 semid_ds 结构,并把 buf 设置为指向这个结构体。 IPC_RMID : 把 semid 指定的信号集从系统中删除。 GETPID : 返回最后一个执行 semop 操作的进程 ID 。 GETVAL : 返回信号集中 semnum 指定信号的值。 GETNCNT : 返回正在等待资源的进程的数量。 GETZCNT : 返回正在等待完全空闲资源的进程数量。 SETVAL : 设置信号集中 semnum 指定的信号的值。
|
|