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 这样描述: "在父进程中打开的任何信号灯,仍在子进程中打开"
Posix有名信号灯 和 基于内存的信号灯一个很明显的区别是初始化不一样
Posix 有名信号灯的初始化如下:



与其对应的关闭信号灯API


当一个进程终止时,内核对其还打开着的有名信号灯自动执行这样的信号灯操作。不管是否正常终止,或异常退出。
关闭了信号灯, 但是并没有从系统中删除掉。


其他的操作诸如: sem_wait( ), sem_post( )等, 都如同Posix 基于内存的无名信号灯。
因为打开的信号灯是基于文件系统的,所以,Posix 有名信号灯天生具备多进程访问能力。不需要额外映射到共享内存区域。
另外,在fork( ) 之前,打开信号灯。例程如下:














这样的代码也是正确的。 Posix.1 这样描述: "在父进程中打开的任何信号灯,仍在子进程中打开"