什么时候调用sem_unlink()?

我有点困惑的Linux API sem_unlink(),主要是什么时候或为什么要调用它。 我已经在Windows中使用了信号量多年。 在Windows中,一旦closures了命名信号量的最后一个句柄,系统就会删除底层的内核对象。 但是在Linux中,开发人员需要通过调用sem_unlink()来移除内核对象。 如果内核对象没有保存在/ dev / shm文件夹中。

我遇到的问题是,如果进程A调用sem_unlink()而进程Blocking了信号量,则立即破坏信号量,而当进程C出现时,进程B不再受信号量的“保护”。 更重要的是,这个手册页最令人困惑的是:

“信号量名称立即被删除,一旦信号量打开的其他进程closures,信号量就会被破坏。

如果需要等待其他进程closures信号量,它如何立即销毁对象?

显然我不明白在Linux上正确使用信号量对象。 谢谢你的帮助。 下面是我用来testing这个的一些示例代码。

int main(void) { sem_t *pSemaphore = sem_open("/MyName", O_CREAT, S_IRUSR | S_IWUSR, 1); if(pSemaphore != SEM_FAILED) { if(sem_wait(pSemaphore) == 0) { // Perform "protected" operations here sem_post(pSemaphore); } sem_close(pSemaphore); sem_unlink("/MyName"); } return 0; } 

Solutions Collecting From Web of "什么时候调用sem_unlink()?"

回答你的问题:

  1. 与你描述的windows的信号量行为相比,POSIX信号量是内核持久化的。 这意味着信号量即使没有信号量打开,也能保持它的价值。 (信号量的引用计数为0)

  2. 如果进程A调用sem_unlink()而进程B锁定了信号量。 这意味着信号量的引用计数不是0,不会被破坏。

sem_close和sem_unlink的基本操作,我认为有助于全面理解:

sem_close: close是一个信号量,当一个进程退出时也是这样。 信号量仍然在系统中。

sem_unlink:只有当引用计数达到0时(即所有进程打开,调用sem_close或退出),才会从系统中删除。

参考文献: Book-Unix Networking Programming-Interprocess Communication,W.Richard Stevens,vol 2,ch10

sem_unlink()函数删除名称标识的信号量,并在所有进程停止使用时标记信号量被销毁(这可能意味着立即,如果信号量已打开的所有进程已经关闭它)。