由于权限错误(EACCES)无法创建POSIX命名信号量

时间:2013-02-21 14:01:27

标签: c posix solaris

这是一个艰难的。

无论在没有信号量的系统上的名称(因此没有名称重叠的可能性),都无法创建名为semaphore(sem_open)的POSIX。这是一个非特权用户,可以使用shmget创建共享内存。

平台:Solaris 10

硬件:Intel Xeon 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

欢迎任何想法 - 我的希望不高。

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

  

POSIX信号量代码使用 / tmp 文件系统创建和存储代码存储器根据 sem_open (3R)中传递的参数映射的文件)打电话。

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