2013-02-23 51 views
1

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

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

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

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

有没有人遇到过这个问题,可以帮忙吗?

+0

user1305858,你有没有找到解决办法? – Robin 2013-03-19 06:24:02

回答

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,以便它是供大家使用。这对调试很有用。在最后的实施中,请记住将其设置回您所需的适当权限。

+0

在Linux上,我看不到使用ipcs的信号量或相关的共享内存。然而重启清除了问题。旧的IT人群解决方案。 – teambob 2015-05-05 04:03:51