1

这是困难的一个。

sem_open无论系统上没有信号量的名称如何(因此没有名称重叠的机会),都无法创建名为 semaphore ( ) 的 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

欢迎任何想法 - 我的希望没有实现。

4

3 回答 3

0

原因是/tmp目录中没有权限。用于创建 POSIX 命名信号量的 SunOS 实现需要在硬编码 /tmp路径中创建文件。这在SOLARIS Internals, Core Kernel Architecture book, page 454 中有记录:

POSIX 信号量代码使用/tmp文件系统来创建和存储代码内存映射的文件,这些文件基于sem_open (3R) 调用中传递的参数。

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

于 2013-02-22T08:06:48.320 回答
0

首先想到的是安全或资源限制设置正在阻止它。我会浏览http://docs.oracle.com/cd/E19575-01/821-0182/fxxtz/index.html以了解这方面的想法。

于 2013-02-21T14:06:57.220 回答
0

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

于 2013-02-21T14:08:23.643 回答