我正在尝试创建一个可以在进程之间共享的简单信号量。我的主程序调用以下函数来创建信号量。
#define SHAREDSEM "/sharedSem"
sem_t *sharedSem = sem_open(SHAREDSEM, O_CREAT, 0644, 1);
但是,我收到错误“权限被拒绝”。我在 Mac OS X 上运行此代码,并且我知道它不支持未命名信号量。但我很确定 sem_open 用于命名信号量。
我尝试使用不同的 t_mode 但没有成功。
还有其他人遇到过这个问题并可以提供帮助吗?
我最近在使用 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,以便所有人都可以访问。这对于调试很有用。在您的最终实现中,请记住将其设置回您需要的适当权限。
我最近在使用 OS X 时遇到了这个问题。我找到的解决方案是取消共享内存的链接,然后再次重新创建它。您也可以尝试重新启动,因为至少对于 Linux 而言,POSIX 样式信号量是内核持久的。 POSIX 命名信号量具有内核持久性:如果没有通过 sem_unlink(3) 删除,信号量将一直存在,直到系统关闭。 当您尝试为该模式授予不正确的权限或可能完全忽略该模式来创建共享内存时,就会出现问题。当您纠正问题并尝试打开信号量时,它仍然使用保留的原始信号量。
==> 这与权限无关.. 如果你没有指定模式 其他进程中的同一用户无法访问信号量!!
指定模式:
sem_t *sharedSem = sem_open(SHAREDSEM, O_RDWR | O_CREAT , 0777, 1);