这是一个艰难的。
无论在没有信号量的系统上的名称(因此没有名称重叠的可能性),都无法创建名为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
欢迎任何想法 - 我的希望不高。
答案 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>
的访问权限。