信号量的基本概念
信号量(又称信号灯)与其它进程间通信方式不大相同,主要用途是保护临近资源,进程可以根据它判断是否能否访问某些共享资源,除了用于访问控制外,还可以进行进程同步。
分类
二值信号灯:信号灯的值只能取零和一,类似于互质锁,但两者又不同:信号灯强调共享资源,只要共享资源可用,其它进程同样可以修改信号灯的值;互斥锁则更强调进程,占用资源的进程使用完毕后,必须由进程本身来解锁。
计数信号灯:信号灯的值可以取任意非负值
创建或者打开信号量:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int semget(key_t key, int nsems , int ****)
key: 键值,由ftok获得
nsems:指定打开或者创建新的信号灯集中将包含的信号灯的数目
****:标识,同消息队列
对信号量的操作:
int semop(int semid, struct sembuf *sops, unsigned nsops)
功能:对信号量进行控制
semid:信号量集的ID
sops:是一个操作数组,表明要进行什么操作
nsops:sops所指向的数组的元素个数
struct sembuf{
unsigned shor sem_num;
short sem_op;
short **;
}
**标识可选择的有两种:
IPC_NOWAIT:对信号的操作不能满足时,semop()不会被阻塞,它会立即返回,同时设定错误信息。
IPC_UNDO :程序结束时(无论正常或者不正常)释放信号量,这样做的目的是在于避免程序在异常的情况下结束时未能将锁定的资源解锁,造成该资源永远锁定。