日期:2014-05-16 浏览次数:20971 次
?
一. 信号灯简介
信号灯与其他进程间通信方式不大相同,它主要提供对进程间共享资源访问控制机制。
相当于内存中的标志,进程可以根据它判定是否能够访问某些共享资源,同时,进程
也可以修改该标志。除了用于访问控制外,还可用于进程同步。
信号灯有以下两种类型:
二值信号灯:最简单的信号灯形式,信号灯的值只能取0或1,类似于互斥锁。?
注:二值信号灯能够实现互斥锁的功能,但两者的关注内容不同。信号灯强调共享资源,
只要共享资源可用,其他进程同样可以修改信号灯的值;互斥锁更强调进程,占用资源
的进程使用完资源后,必须由进程本身来解锁。
计算信号灯:信号灯的值可以取任意非负值(当然受内核本身的约束)。
系统V信号灯是随内核持续的,只有在内核重起或者显示删除一个信号灯集时,该信号
灯集才会真正被删除。
?
二. 信号灯的基本操作
对信号灯的操作无非有下面三种类型:
1、打开或创建信号灯?
2、信号灯值操作?
? ? linux可以增加或减小信号灯的值,相应于对共享资源的释放和占有。具体参见后面的
? ? semop系统调用。
3、获得或设置信号灯属性:?
? ? 系统中的每一个信号灯集都对应一个struct sem_array结构,该结构记录了信号灯集
? ? 的各种信息,存在于系统空间。为了设置、获得该信号灯集的各种信息及属性,在用户
? ? 空间有一个重要的联合结构与之对应,即union semun。
三、系统V信号灯API
系统V消息队列API只有三个,使用时需要包括几个头文件:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
1)int semget(key_t key, int nsems, int semflg)?
参数key是一个键值,由ftok获得,唯一标识一个信号灯集.
参数nsems指定信号灯集包含信号灯的数目;
semflg参数是一些标志位。
该调用返回与健值key相对应的信号灯集id
调用返回:成功返回信号灯集描述字,否则返回-1。?
?
2)int semop(int semid, struct sembuf *sops, unsigned nsops);?
semid是信号灯集ID,sops数组的每一个sembuf结构都刻画一个在特定信号灯上的操作。
nsops为sops数组的大小。?sembuf结构如下:
struct sembuf {
unsigned short ? sem_num; /* semaphore index in array */
short sem_op; /* semaphore operation */
short sem_flg; /* operation flags */
};
sem_num对应集合中的信号灯,0对应第