信号量
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:程序结束时(无论正常或不正常)释放信号量,这样做的目的在于避免程序在异常情况下结束时未将锁定的资源解锁,造成该资源永远锁定。