我最近在使用 OS X 时遇到了这个问题。我找到的解决方案是取消链接共享内存,然后重新创建它。您也可以尝试重新启动,因为至少对于 Linux,POSIX 风格的信号量是内核持久的。
POSIX 命名信号量具有内核持久性:如果没有被 sem_unlink(3) 删除,信号量将一直存在,直到系统关闭。
当您尝试创建共享内存时为该模式提供不正确的权限,或者可能完全忽略该模式时,就会出现问题。然后,当您更正问题并尝试打开信号量时,它仍在使用保留的原始信号量。
所以尝试这样做:
#define SHAREDSEM "/sharedSem"
sem_unlink(SHAREDSEM);
sem_t *sharedSem = sem_open(SHAREDSEM, O_CREAT, 0777, 1);
如果这是您希望创建信号量的唯一位置,那么您可以选择添加O_EXCL
选项,如果信号量已经存在,则该选项会失败。这可能至少对调试有用,以查看这是否是您面临的问题。
为此,请尝试:
#define SHAREDSEM "/sharedSem"
sem_unlink(SHAREDSEM);
sem_t *sharedSem = sem_open(SHAREDSEM, O_CREAT | O_EXCL, 0777, 1);
请注意,在这些示例中,我将权限设置为 0777,以便所有人都可以访问它。这对于调试很有用。在您的最终实现中,请记住将其设置回您需要的正确权限。