c - 信号量权限被拒绝

标签 c macos process multiprocessing semaphore

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

#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 named semaphores have kernel persistence: if not removed by sem_unlink(3), a semaphore will exist until the system is shut down.

当您尝试通过为模式提供不正确的权限或者可能完全省略模式来创建共享内存时,就会出现问题。当您随后更正问题并尝试打开信号量时,它仍在使用保留的原始信号量。

所以尝试这样做:

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

关于c - 信号量权限被拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15045910/

相关文章:

macos - 不小心从 mac 中删除了 Digicert 证书

xcode - 应用组容器是否应该有团队标识符?

c - 如何重置指针

c - 函数声明中的函数指针是否有C语法

ios - swift 中奇怪的泛型行为

c - 为什么我在命令行上看不到 execvp() 的结果?

c - 解析和 evecvp 问题

linux - 如何在 Bash 中将进程的子进程输出为数字

c++ - 我的 usercall 函数的 stdcall 包装器是否正确?

c - 如何将默认浮点值初始化为结构数组?