Linux笔记_进程通讯——信号量

本文详细介绍了信号量的概念、分类、创建与操作方法,包括二元信号灯与计数信号灯的区别,以及如何通过semget、semop等API进行信号量的管理。信号量在进程同步和资源访问控制中的作用被重点阐述。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

信号量

1.定义: 
信号量(又名信号灯)与其它进程间通信方式不大相同,主要用途是保护临界资源。进程可以根据它判定是否能够访问某些共享资源。除了用于访问控制外,还可用于进程同步。 
 
2.分类
1)二值信号灯:信号灯的值只能取0或1,类似于互斥锁。但两者有不同:信号灯强调共享资源,只要共享资源可用,其他进程同样可以修改信号灯的值;互斥锁更强调进程,占用资源的进程使用完资源后,必须由进程本身来解锁。
初始值为1,资源可用。
2)计数信号灯:信号灯的值可以取任意非负值
信号灯值>=1,可以访问,访问将灯的值减1,0表示不可访问
3.创建/打开
#include <sys/typess.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int semget(key_t key,int nsems,int semflg)
参数:
key:键值,由ftok获得;
nsems:指定打开或者新创建的信号灯集中将包含信号灯的数目
semflg:标识,同消息队列

4.操作
int semop(int semid,struct sembuf*sops,unsigned nsops)
功能:对信号量进行控制
semid:信号量集的ID
sops:是一个操作数组,表明要进行什么操作
nsops:sops所指向的数组的元素个数
struct sembuf{
     unsigned short sem_num;
     short sem_op;
     short sem_flg;
}
sem_num:要操作的信号量在信号量集中的编号,第一个信号的编号是0;
sem_op:如果其值为正数,该值会加到现有的信号量值中,通常用于释放信号量;如果sem_op值为负数,而其绝对值又大于信号的现值,操作将会阻塞,直到信号值大于或等于sem_op的绝对值,通常用于获取信号量,如果sem_op的值为0,则操作将暂时阻塞,直到信号的值变为0.
sem_flg:
信号操作标志,可能的选择有两种;
IPC_NOWAIT:对信号的操作不能满足时,semop()不会阻塞,并立即返回,同时设定错误信息。
IPC_UNDO:程序结束时(无论正常或不正常)释放信号量,这样做的目的在于避免程序在异常情况下结束时未将锁定的资源解锁,造成该资源永远锁定。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值