信号量通信模块
信号量作用:主要的作用就是保护临街资源,也就是说,如果来年各
个进程都需要用到某个资源,那么通过信号量,让进程A和进程B分别占有
一定的信号量,每次信号量只能准许一个进程访问,信号量是有时间
限制的,这样就可以使两个进程都有机会访问同一个资源。
分类:
二值信号量 :信号灯的只能取0和1,类似互斥概念。当资源为可用的
时候,信号灯可以自己对资源信号灯进行修改,变为可用。二互斥锁概
念强调的是进程,进程占用完资源后,必须由该进程来解锁,
计数信号灯:信号灯的值可以取任意非负值。这种情况,就像我在工厂打工,
每次下班都在刷卡,第一次刷卡不成功,就不能在刷了,排在后面先让其他人
在刷,等其他人刷好了,你在刷,因为每个人刷卡的时间都是有限的,可以这
样理解,这样就避免了死锁灯问题。
创建 打开
int semget(key_t key, int nsems,int semflg)
key : 键值,上一篇博客有提到,第一步要做的事。
nsems: 打开或者穿件信号灯集合数目;
semflg:标识,和消息队列差不多;
操作
int semop(int semid, struct sembuf*sops, unsigned nsops)
参数:
semid:信号量集合的ip
sops; 操作数,表明要操作的内容
nsops: sops所指向的数组的元素个数;要多少个操作
struct sembuf{
unsigned short sem_num; //获取信号量的第几个,数组下表
short sem_op; //获取还是,释放信号量,1为释放,-1获取
short sem_flg; // 标志,IPC_NOWAIT,当操作数不满足是,立即返回错误
IPC_UNDO程序无论正常还是不正常都释放信号量,避免死锁。
}