2013-06-12 39 views
3

我在CLinux中使用named semaphore来控制跨多个进程访问共享内存。 截至目前我还没有添加任何代码到sem_closesem_unlink的信号量。 所以我的问题是:关于在C Linux中命名信号量的疑问

当所有使用它的进程完成后,命名信号量会自动被破坏吗?

如果是的话,可以吗?根本不需要拨打sem_closesem_unlink

回答

4

http://linux.die.net/man/7/sem_overview

“命名信号POSIX有内核的持久性:如果不通过sem_unlink删除(3),信号会存在,直到系统关闭。”

+0

@Piotr还有一个问题:如果一个进程打开一个信号量并退出而不调用'sem_close'和'sem_unlink'。有没有一种方法可以在系统关闭的情况下将其删除。我们不能在这里使用'ipcrm -s',因为这些都是posix信号量。 –

+0

答案在同一个手册页上。其实至少有三个有效答案:) –

1

从sem_close()函数是用来表示调用进程使用命名信号量由SEM表示完成了手册页http://pubs.opengroup.org/onlinepubs/7908799/xsh/sem_close.html

。调用sem_close()对未命名信号量(由sem_init()创建的信号量)的影响未定义。 sem_close()函数通过此进程释放(也就是说,可供此进程的后续sem_open()重用)系统分配的任何系统资源,供此进程用于此信号量。随后使用此过程的sem指示的信号量的影响未定义。如果信号量在成功调用sem_unlink()后未被移除,则sem_close()对信号量的状态没有影响。

If the sem_unlink() function has been successfully invoked for name after the most recent call to sem_open() with O_CREAT for this semaphore, then when all processes that have opened the semaphore close it, the semaphore is no longer be accessible.

因此,在本质当所有已打开的信号量的过程已经成功调用sem_unlink和sem_close信号灯被破坏。