关于 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_close
和 sem_unlink
添加任何代码。
所以我的问题是:
当所有使用它的进程完成后,命名信号量会自动销毁吗?
如果是的话,可以不打电话给sem_close
和sem_unlink
吗?
【问题讨论】:
【参考方案1】:http://linux.die.net/man/7/sem_overview
“POSIX 命名信号量具有内核持久性:如果不被 sem_unlink(3) 删除,信号量将一直存在,直到系统关闭。”
【讨论】:
@Piotr 还有一个问题:如果一个进程打开一个信号量并在没有调用sem_close
和sem_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 C语言 信号量 sem_init() sem_wait() sem_timedwait() sem_post() sem_destroy()
Linux C语言 信号量 sem_init() sem_wait() sem_timedwait() sem_post() sem_destroy()