#include
int semctl(int semid, int semnum, int cmd, ... /*union semun arg*/);
成功返回非负值,出错返回-1
参数semid标识其操作待控制的信号量集
参数semnum标识该信号量集内的某个成员,semnum值仅仅用于GETVAL/SETVAL/GETNCNT/GETZCNT/GETPID
system v支持下列cmd:
GETVAL ---把semval的当前值作为函数返回值返回。既然信号量绝不会是负数(semval被声明成一个整数unsigned short),那么成功的返回值总是非负数
SETVAL ---把semval值设置成为arg.val。如果操作成功,那么相应信号量在所有进程中的信号量调整值(semadj)将被置为0。
GETPID ---把sempid的当前值作为函数返回值返回
GETNCNT---把semncnt的当前值作为函数返回值返回
GETZCNT---把semzcnt的当前值作为函数返回值返回
GETALL----返回所指定信号量集内每个成员的semval值。这些值通过arg.array指针返回,函数本身的返回值则为0。注意,调用者必须分配一个unsigned short整数数组,该数组要足够容纳所指定信号量集内所有成员的semval值,然后把arg.array设置成指向这个数组。
SETALL----设置所指定信号量集中每个成员的semval值。这些值是通过arg.array指针指定的。
IPC_RMID--把由semid指定的信号量集从系统中删除掉。
IPC_SET---设置所指定信号量集的semid_ds结构中的以下三个成员:sem_perm.uid、sem_perm.gid和sem_perm.mode,这些值来自由arg.buf参数指向的结构中的相应成员。semid_ds结构中的sem_ctime成员也被设置成当前时间
IPC_STAT--(通过arg.buf参数)返回所指定信号量集当前的semid_ds结构。注意,调用者必须首先分配一个semid_ds结构,并把arg.buf设置成指向这个结构。
union semun {
int val; /*used for SETVAL only*/
struct semid_ds *buf; /*used for IPC_SET and IPC_STAT*/
oshort *array; /*used for GETALL and SETALL*/
struct seminfo *__buf; /* Buffer for IPC_INFO(Linux-specific) */
};
The semid_ds data structure is defined in as follows:
struct semid_ds {
struct ipc_perm sem_perm; /* Ownership and permissions */
time_t sem_otime; /* Last semop time */
time_t sem_ctime; /* Last change time */
unsigned short sem_nsems; /* No. of semaphores in set */
};
The ipc_perm structure is defined in as follows (the highlighted fields are settable
using IPC_SET):
struct ipc_perm {
key_t __key; /* Key supplied to semget(2) */
uid_t uid; /* Effective UID of owner */
gid_t gid; /* Effective GID of owner */
uid_t cuid; /* Effective UID of creator */
gid_t cgid; /* Effective GID of creator */
unsigned short mode; /* Permissions */
unsigned short __seq; /* Sequence number */
};
阅读(1275) | 评论(0) | 转发(0) |