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);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
}
这样的代码也是正确的。 Posix.1 这样描述: "在父进程中打开的任何信号灯,仍在子进程中打开"
Posix有名信号灯 和 基于内存的信号灯一个很明显的区别是初始化不一样
Posix 有名信号灯的初始化如下:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
与其对应的关闭信号灯API
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
当一个进程终止时,内核对其还打开着的有名信号灯自动执行这样的信号灯操作。不管是否正常终止,或异常退出。
关闭了信号灯, 但是并没有从系统中删除掉。
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
其他的操作诸如: sem_wait( ), sem_post( )等, 都如同Posix 基于内存的无名信号灯。
因为打开的信号灯是基于文件系统的,所以,Posix 有名信号灯天生具备多进程访问能力。不需要额外映射到共享内存区域。
另外,在fork( ) 之前,打开信号灯。例程如下:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
这样的代码也是正确的。 Posix.1 这样描述: "在父进程中打开的任何信号灯,仍在子进程中打开"