【问题标题】:Semaphore permission denied信号量权限被拒绝
【发布时间】:2013-02-23 21:27:04
【问题描述】:

我正在尝试创建一个可以在进程之间共享的简单信号量。我的主程序调用以下函数来创建信号量。

#define SHAREDSEM "/sharedSem"
sem_t *sharedSem = sem_open(SHAREDSEM, O_CREAT, 0644, 1); 

但是,我收到错误“权限被拒绝”。我在 Mac OS X 上运行这段代码,我知道它不支持未命名的信号量。但我很确定 sem_open 适用于命名信号量。

我尝试过使用不同的 t_mode,但没有成功。

有没有其他人遇到过这个问题并可以提供帮助?

【问题讨论】:

  • user1305858,你找到解决办法了吗?

标签: c macos process multiprocessing semaphore


【解决方案1】:

我最近在使用 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,以便所有人都可以访问它。这对于调试很有用。在您的最终实现中,请记住将其设置回您需要的适当权限。

【讨论】:

  • 在 Linux 上,我看不到使用 ipcs 的信号量或相关共享内存。但是,重新启动解决了问题。旧的 IT Crowd 解决方案。
猜你喜欢
  • 2015-11-20
  • 2015-08-30
  • 1970-01-01
  • 1970-01-01
  • 2018-07-19
  • 2018-02-05
  • 2015-04-28
相关资源
最近更新 更多