日期:2014-05-16  浏览次数:20876 次

Linux进程通信 之 信号灯(semphore)

?

一. 信号灯简介

信号灯与其他进程间通信方式不大相同,它主要提供对进程间共享资源访问控制机制。

相当于内存中的标志,进程可以根据它判定是否能够访问某些共享资源,同时,进程

也可以修改该标志。除了用于访问控制外,还可用于进程同步。

信号灯有以下两种类型:

二值信号灯:最简单的信号灯形式,信号灯的值只能取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对应第