关于 C Linux 中命名信号量的疑问

Posted

技术标签:

【中文标题】关于 C Linux 中命名信号量的疑问【英文标题】:Doubts regarding Named Semaphore in C Linux 【发布时间】:2013-06-12 10:44:07 【问题描述】:

我正在使用named semaphore in C in Linux 来控制跨多个进程对共享内存的访问。 到目前为止,我还没有向信号量 sem_closesem_unlink 添加任何代码。 所以我的问题是:

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

如果是的话,可以不打电话给sem_closesem_unlink 吗?

【问题讨论】:

【参考方案1】:

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

“POSIX 命名信号量具有内核持久性:如果不被 sem_unlink(3) 删除,信号量将一直存在,直到系统关闭。”

【讨论】:

@Piotr 还有一个问题:如果一个进程打开一个信号量并在没有调用sem_closesem_unlink 的情况下退出。有没有办法在不关闭系统的情况下删除它。我们不能在这里使用ipcrm -s,因为这些是posix 信号量。 答案在同一个手册页上。实际上至少三个有效答案:)【参考方案2】:

来自手册页http://pubs.opengroup.org/onlinepubs/7908799/xsh/sem_close.html

sem_close() 函数用于指示调用进程已使用 sem 指示的命名信号量完成。为未命名的信号量(由 sem_init() 创建的信号量)调用 sem_close() 的效果是未定义的。 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 时,信号量就被销毁了。

【讨论】:

以上是关于关于 C Linux 中命名信号量的疑问的主要内容,如果未能解决你的问题,请参考以下文章

在 Linux 内核命名空间之间使用 POSIX 信号量

pthreads等待和信号疑问linux

如何正确销毁 C 中多个进程使用的共享未命名信号量?

正确销毁命名的 System V 信号量

Linux C语言 信号量 sem_init() sem_wait() sem_timedwait() sem_post() sem_destroy()

Linux C语言 信号量 sem_init() sem_wait() sem_timedwait() sem_post() sem_destroy()