![](https://csdnimg.cn/release/download_crawler_static/3164007/bg3.jpg)
Unix 下信号灯和共享内存的使用方法
表 2-1 信号灯调用 semget 中 sem_flg 参数选择项
数值(八进制)
符号
描述
0400
0200
0040
0020
0004
0002
01000
02000
SEM_R
SEM_A
SEM_R>>3
SEM_A>>3
SEM_R>>6
SEM_A>>6
IPC_CREAT
IPC_EXCL
拥有者可读
拥有者可写
同组者可读
同组者可写
其他人可读
其他人可写
创建或获取一个信号灯集合
创建一个新的信号灯集合
说明:
1.设置 semflag 的 IPC_CREAT 位,则创建一个信号灯集合,如果该信号灯集合已经存
在,则返回其标识符(semid);
2.设置 semflag 的 IPC_CREAT|IPC_EXCL 位,则创建一个新的信号灯集合,如果已经
存在则返回错误信息;
3.只设置 IPC_EXCL 位而不设置 IPC_CREAT 位没有任何意义。
2.2.2 系统调用 semop
作用:对信号灯集合中一个或多个信号灯进行操作
形式:int semop(int semid, struct sembuf *sops, unsigned int nops);
返回值:操作成功返回 0,失败返回-1。
描述:
数组 sops 的每个元素对应一次操作。nops 指明执行几次操作。
sembuf 是具有如下形式的一个数据结构的数组:
struct sembuf{
unsigned short sem_num; /* semaphore number. */
short semop; /* semaphore operation. */
short sem_flg; /* operation flags. */
}
该结构对应了信号灯的某种操作。
信号灯的 sem_num 值标明它是信号灯集合的第几个元素,第一个信号灯为 0,第二个为 1,
依次类推。semop 确定了对信号灯采取什么样的操作,它可以为负数,正数和零。sem_flg
指明操作的执行模式,它有两个标志位:
IPC_NOWAIT(04000):指明以非阻塞方式操作信号灯。
SEM_UNDO(010000): 指明内核为信号灯操作保留恢复值。
System V 将信号灯的值 semval 初始化为 0。信号灯值为 0 时可以使用,为非 0 时不可使用。
对信号灯的操作可以用以下原语来描述:
1.If sem_op>0 Then /*sem_op>0 对应对信号灯的抢占。*/
semval=semval+sem_op; /*抢占成功,信号灯当前值加上 sem_op*/
2.If sem_op==0 Then /*sem_op==0 对应对信号灯使用权的请求。*/
{
If semval==0 Then /*semval==0 表明信号灯可以使用,*/
立即返回; /*请求成功. */
Else /*semval!=0表明信号灯不可使用*/
信息产业部数据通信技术研究所
陈明俊
3