进程间通讯《六》

Posix 有名信号灯。

Posix有名信号灯 和 基于内存的信号灯一个很明显的区别是初始化不一样
Posix 有名信号灯的初始化如下:
sem_t  * sem_open( const   char   * name,  int  oflag);
sem_t 
* sem_open( const   char   * name,  int  oflag, mode_t mode, unsigned  int  value);
  返回: 成功返回新的sem, 失败返回SEM_FAILED, 并置响应errno;

与其对应的关闭信号灯API

int  sem_close(sem_t  * sem);
  返回: 成功返回0, 失败为
- 1

当一个进程终止时,内核对其还打开着的有名信号灯自动执行这样的信号灯操作。不管是否正常终止,或异常退出。

关闭了信号灯, 但是并没有从系统中删除掉。

int  sem_unlink( const   char   * name);
  返回: 成功返回0, 失败 返回
- 1

其他的操作诸如: sem_wait( ), sem_post( )等, 都如同Posix 基于内存的无名信号灯。

因为打开的信号灯是基于文件系统的,所以,Posix 有名信号灯天生具备多进程访问能力。不需要额外映射到共享内存区域。

另外,在fork( ) 之前,打开信号灯。例程如下:
mutex  =  sem_open(name, IPC_CREAT  |  IPC_EXCL,  0666 1 );
pid 
=  fork( );
if  (pid  <   0 )   return   - 1 ;
if  (pid  ==   0 {
  sem_wait(mutex);
  ...
  sem_post( mutex);
}
  else   {
sem_wait(mutex);
...
sem_post(mutex);

}

 
这样的代码也是正确的。 Posix.1 这样描述: "在父进程中打开的任何信号灯,仍在子进程中打开"
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值