无法通过Web访问PHP / C ++共享内存

时间:2010-11-15 17:04:45

标签: php c++ permissions shared-memory

我在C ++和PHP之间共享一些内存

在PHP结束时我有:

   $inputshm_id = shmop_open($shid, "w", 0777, 1024);

其中shid是我用ftok创建的标识符。

当我运行在服务器上以root用户身份登录的PHP脚本时,这一切都正常,但是当我尝试通过Web远程运行它时,我得到了:

警告:shmop_open()[function.shmop-open]:无法在第6行的/var/www/html/prof/phpsm.php中附加或创建共享内存段

...第6行是我上面显示的行。

因为当我以root身份从服务器运行它时它运行正常我假设某处某处阻止了Web用户请求连接到共享内存。

有谁知道造成这种情况的原因是什么?

由于

2 个答案:

答案 0 :(得分:1)

问题是SELinux正在阻止shm访问(您可以通过运行setenforce 0进行验证,测试并运行setenforce 1之后),但我不知道解决其他问题的好方法而不是修改政策或切换到mmap。

答案 1 :(得分:0)

只是为了添加到接受的答案,我需要将SELinux保持在强制模式,所以我最终执行以下操作以允许在PHP中访问共享内存操作:

  1. 将selinux置于许可模式
  2. 将selinux置于“不阻止”模式: semodule -DB (这很重要,因为默认情况下没有记录shmop操作)
  3. 清除/var/log/audit/audit.log
  4. 使用共享内存操作执行违规脚本
  5. 生成了一个selinux模块: audit2allow -a -M audit.log
  6. 安装模块: semodule -i audit.log.pp
  7. 我最后经历了几次迭代以确保正确,但我对CentOS 6的最终政策是:

    module audit.log 1.0;
    require {
            type unconfined_t;
            type httpd_t;
            type audisp_t;
            type auditd_t;
            type user_tmpfs_t;
            class process { siginh noatsecure rlimitinh };
            class shm { associate unix_read getattr read };
            class file { read };
    }
    allow auditd_t audisp_t:process { siginh rlimitinh noatsecure };
    allow httpd_t unconfined_t:shm { associate unix_read getattr read };
    allow httpd_t user_tmpfs_t:file read;