码迷,mamicode.com
首页 > 系统相关 > 详细

XSI进程间通信-----信号量

时间:2015-08-01 23:35:49      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:uc

1. 基本特点

 1) 相当于计数器,用于限制多个进程对有限共享资源的访问。

 2) 多个进程获取有限共享资源的操作模式

 A. 测试控制该资源的信号量;

 B. 若信号量大于0,则进程可以使用该资源, 为了表示此进程已获得该资源,需将信号量减1

 C. 若信号量等于0,则进程休眠等待该资源, 直到信号量大于0,进程被唤醒,执行步骤A

 D. 当某进程不再使用该资源时,信号量增1  正在休眠等待该资源的其它进程将被唤醒。


2. 常用函数

1) 创建/获取信号量

int semget (key_t key, int nsems, int semflg);

A. 该函数以key参数为键值创建一个信号量集合  (nsems参数表示集合中的信号量数 ,或获取已有的信号量集合(nsems0)

B. semflg取值:
  0         - 获取,不存在即失败。
  IPC_CREAT - 创建,不存在即创建,已存在即获取,除非...
  IPC_EXCL  - 排斥,已存在即失败。

C. 成功返回信号量集合标识,失败返回-1。

2) 操作信号量

int semop (int semid, struct sembuf* sops,unsigned nsops);<span style="font-family: 宋体; font-size: 12px;"> </span>
struct sembuf {
    unsigned short sem_num; // 信号量下标
    short          sem_op;  // 操作数
    short          sem_flg; // 操作标记
};

A. 该函数对semid参数所标识的信号量集合中, 由sops参数所指向的包含nsops个元素的, 结构体数组中的每个元素,依次执行如下操作:

   a) sem_op大于0 则将其加到第sem_num个信号量的计数值上,以表示对资源的释放;

   b) sem_op小于0则从第sem_num个信号量的计数值中减去其绝对值,以表示对资源的获取;

   c) 若第sem_num个信号量的计数值不够减(信号量不能为负) 则此函数会阻塞,直到该信号量够减为止,以表示对资源的等待;

   d) sem_flg包含IPC_NOWAIT位,则当第sem_num个信号量的计数值不够减时, 此函数不会阻塞,而是返回-1errnoEAGAIN以便在等待资源的同时还可做其它处理;

   e) sem_op等于0则直到第sem_num个信号量的计数值为0时才返回, 除非sem_flg包含IPC_NOWAIT位。

B. 成功返回0,失败返回-1


3) 销毁/控制信号量




版权声明:本文为博主原创文章,未经博主允许不得转载。

原文地址:http://blog.csdn.net/meetings/article/details/47191957

XSI进程间通信-----信号量

标签:uc

原文地址:http://blog.csdn.net/meetings/article/details/47191957

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!