Linux系统调用--semctl函数详解

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

【semctl系统调用】

功能描述:

在指定的信号集或信号集内的某个信号上执行控制操作。

用法:

#include

#include

#include

int semctl(int semid, int semnum, int cmd, ...);

参数:

semid:信号集的标识符,即是信号表的索引。

semnum:信号集的索引,用来存取信号集内的某个信号。

cmd:需要执行的命令,有效值有

IPC_STAT //将与semid关联的内核数据结构拷贝到由arg.buf指针指向的内存区。

IPC_SET //将由arg.buf指针指向的semid_ds的一些成员写入相关联的内核数据结构,同时更新它的sem_ctime成员。

IPC_RMID //立即删除信号集,唤醒所有被阻塞的进程。

IPC_INFO //Linux特有命令,返回系统范围内关于信号集的制约和其它参数,并存放在arg.__buf指向的内存区。其结构形态如下:

struct seminfo {

int semmap;

int semmni;

int semmns;

int semmnu;

int semmsl;

int semopm;

int semume;

int semusz;

int semvmx;

int semaem;

};

SEM_INFO //返回和IPC_INFO相同的信息,不同点有:semusz字段包含有当前系统存在的信号集总量。semaem字段包含有系统内所有信号集的信号总量。

SEM_STAT //返回和IPC_STAT相同的信息。不过参数semid不是一个信号集标识,而是内核内部维持所有信号集信息的数组索引。

GETALL //将所有信号的值存入semun.array中。

GETNCNT //等待信号值增加的进程的总数。

GETPID //前一个对此信号进行操作的进程的识别码。

GETVAL //根据semnun返回信号的值。

GETZCNT //等待信号值变为0的进程的总数。

SETALL //将所有semun.array的值设定到信号集中。

SETVAL //根据semun设定信号的值。

...:对于不同的命令,可能需要用到也可能不需要,是一个联合体,原型如下

union semun {

int val;

struct semid_ds *buf;

unsigned short *array;

struct seminfo *__buf;

};

semid_ds结构体定义在,原型如下

struct semid_ds {

struct ipc_perm sem_perm;

time_t sem_ctime;

unsigned short sem_nsems;

};

ipc_perm结构体定义在,原型如下

struct ipc_perm {

key_t key;

uid_t uid;

gid_t gid;

uid_t cuid;

gid_t cgid;

unsigned short mode;

unsigned short seq;

};

返回说明:

成功执行时,根据不同的命令返回不同的非负值

GETNCNT //返回semncnt的值

GETPID //返回sempid的值

GETVAL //返回semval的值

GETZCNT //返回semzcnt的值

IPC_INFO //返回内核内部关于信号集信息的最大可用入口索引SEM_INFO //如同IPC_INFO.

SEM_STAT //返回信号集标识

剩下的命令返回0。

失败返回-1,errno被设为以下的某个值

EACCES:访问出错,权能不允许

EFAULT:arg.buf 或arg.array所指的空间不可访问EIDRM:信号集已被删除

EINVAL;参数无效

EPERM:权能不允许

ERANGE:给出的参数无效

相关文档
最新文档