我对 Linux API sem_unlink() 有点困惑,主要是何时或为何调用它。我在 Windows 中使用信号量已经很多年了。在 Windows 中,一旦您关闭命名信号量的最后一个句柄,系统就会删除底层内核对象。但是在 Linux 中,开发人员需要通过调用 sem_unlink() 来删除内核对象。如果您不这样做,内核对象将保留在 /dev/shm 文件夹中。
我遇到的问题是,如果进程 A 调用 sem_unlink() 而进程 B 锁定了信号量,它会立即破坏信号量,现在当进程 C 出现时,进程 B 不再受到信号量的“保护”。更重要的是,手册页充其量是令人困惑的:
“信号量名称立即被删除。一旦所有其他打开信号量的进程关闭它,信号量就会被销毁。”
如果必须等待其他进程关闭信号量,它如何立即销毁对象?
显然我不明白在 Linux 上正确使用信号量对象。谢谢你的帮助。下面是我用来测试的一些示例代码。
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;
}