【发布时间】:2013-06-12 10:44:07
【问题描述】:
我正在使用named semaphore in C in Linux 来控制跨多个进程对共享内存的访问。
到目前为止,我还没有向信号量 sem_close 和 sem_unlink 添加任何代码。
所以我的问题是:
当所有使用它的进程完成后,命名信号量会自动销毁吗?
如果是的话,可以不打电话给sem_close 和sem_unlink 吗?
【问题讨论】:
我正在使用named semaphore in C in Linux 来控制跨多个进程对共享内存的访问。
到目前为止,我还没有向信号量 sem_close 和 sem_unlink 添加任何代码。
所以我的问题是:
当所有使用它的进程完成后,命名信号量会自动销毁吗?
如果是的话,可以不打电话给sem_close 和sem_unlink 吗?
【问题讨论】:
http://linux.die.net/man/7/sem_overview
“POSIX 命名信号量具有内核持久性:如果不被 sem_unlink(3) 删除,信号量将一直存在,直到系统关闭。”
【讨论】:
sem_close 和sem_unlink 的情况下退出。有没有办法在不关闭系统的情况下删除它。我们不能在这里使用ipcrm -s,因为这些是posix 信号量。
来自手册页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 时,信号量就被销毁了。
【讨论】: