2013-02-21 50 views
1

这是一个棘手的问题。由于权限错误,无法创建POSIX命名信号(EACCES)

无论系统中没有信号量的名称(因此没有名称重叠机会),无法创建POSIX命名信号量(sem_open)。这是一个非特权用户,可以使用shmget创建共享内存。

平台:的Solaris 10

硬件:英特尔至强E5000系列CPU

上运行AMD的CPU与非特权用户其他Solaris 10平台上不会发生。在Linux机器上不会发生。这些机器之间没有明显的区别,除了这台机器很可能是虚拟化的。

代码:

const char* name = "/permission_test_semaphore"; 

    sem_t* sem = sem_open(name, O_CREAT | O_EXCL, 0644, 0); 
    if (SEM_FAILED == sem) 
    { 
      printf("Could not create test semaphore %s, errno = %d\n", name, errno); 
    } 

输出是:

Could not create test semaphore /permission_test_semaphore, errno = 13 

任何想法,欢迎 - 我的希望都没有了。

+1

ipcs与POSIX sems无关。它适用于传统的sysvipc。 – 2013-02-21 14:40:27

+0

正确 - 双重检查。拿出了'ipcs'的参考。谢谢 – Makanaky 2013-02-21 14:42:01

回答

0

首先想到的是安全性或资源限制设置正在阻止它。我想通过http://docs.oracle.com/cd/E19575-01/821-0182/fxxtz/index.html寻找想法。

+0

良好的领导。不幸的是,与正在运行的Solaris机器相比,'prctl $$'没有区别,例如。 'prctl -n process.max-sem-ops $$'产生默认值。 – Makanaky 2013-02-21 14:22:14

0

在Linux上,/ dev/shm必须存在用于POSIX共享内存和信号量。我怀疑Solaris需要类似的东西。

+0

其他Solaris机器在'dev/shm'上没有任何东西,创建信号只是起作用。 – Makanaky 2013-02-21 14:18:16

+0

我确认在正在运行的Linux机器上设置'/ dev/shm'。 – Makanaky 2013-02-21 14:25:14

+0

你试过strace了吗? – 2013-02-21 16:37:43

0

原因是/tmp目录中没有权限。用于创建POSIX命名信号的SunOS实现需要在硬编码/tmp路径中创建文件。这是在SOLARIS内幕记载,核心内核架构书,454页:

POSIX信号代码使用该代码的内存映射文件的创建和存储的/ tmp基于文件系统的关于通过sem_open(3R)调用传递的参数。

运行truss <executable>将在屏幕出现错误之前显示对/tmp/.SEML<sem_name>的访问权限。

相关问题