进程间通信-信号量

本文介绍了信号量的基本操作,包括创建和获取信号量(semget)、初始化和删除信号量(semctl)以及PV操作(semop)。详细解释了这些函数的参数含义及用法,并通过实例帮助理解信号量的工作原理。

信号量的操作:

1.创建或者获取:semget()

int semget(key_t key, int num_sems, int sem_flags );

第一个参数是整数值,不相关的进程可以通过它访问同一个信号量;

第二个参数指定需要的信号量数目,基本取值为1;

第三个参数则是一组标志,它与open函数的标志非常相似,如果该函数创建出的信号量已存在,则返回一个错误。

2.初始化(删除):semctl()

int semctl(int sem_id, int sem_num, int command, ......);

第一个参数sem_id是semget函数返回的信号量标识符;

第二个参数是信号量编号,一般取值为0,表示这是第一个也是唯一一个信号量;

第三个参数是将要采取的动作,例如SETVAL表示把信号量初始化一个已知的值,而IPC_RMID则是删除一个已经无法使用的信号量标识符;

如果有第四个参数,则是一个联合体结构,需要程序员自己定义。

3.PV操作:semop()

semop函数的一切动作都是一次性完成。

semop函数用于改变信号量的值:int semop(int sem_id, struct sembuf *sem_ops, size_t num_sem_ops);

第一个参数sem_id是semget函数返回的信号量标识符;

第二个参数sem_ops是指向一个结构数组的指针,每个数组元素至少包含以下几个成员:

struct sembuf{
     short sem_num;
     short sem_op;
     short sem_flag;
}

   依次为信号量编号(除非使用,否则一般为0),信号量在操作中需要改变的数值(P操作(-1),等待信号量变为可用;V操作(+1),发送信号量表示信号量现在可用);操作系统跟踪当前进程对这个信号量的修改情况(一般情况被设置为SEM_UNDO,如果此进程在没有释放信号量的情况下终止,则操作系统自动释放该进程的信号量)。

第三个参数表示信号量的个数。


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值