我正在尝试创建一个可以在进程之间共享的简单信号量。我的主程序调用以下函数来创建信号量。
#define SHAREDSEM "/sharedSem"
sem_t *sharedSem = sem_open(SHAREDSEM, O_CREAT, 0644, 1);
但是,我收到错误“Permission Denied”。我在Mac OS X上运行此代码,我知道它不支持未命名的信号量。但我很确定sem_open用于命名信号量。
我尝试过使用不同的t_mode但没有成功。
是否还有其他人遇到此问题并可以提供帮助?
答案 0 :(得分:4)
我最近在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,以便所有人都可以访问它。这对调试很有用。在最终实现中,请记住将其设置回所需的适当权限。