进程间通讯《六》

来源:互联网 发布:java string存储中文 编辑:程序博客网 时间:2024/05/04 01:05
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, 06661);
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 这样描述: "在父进程中打开的任何信号灯,仍在子进程中打开"
原创粉丝点击