2010-11-15 25 views
1

我分享一些存儲區域C++和PHP無法訪問PHP/C++共享內存在網上

在PHP結束時,我有:

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

哪裏SHID是我ftok創建的標識符。

這一切工作正常,當我運行這個PHP腳本登錄的服務器上的根,但是當我試圖通過網絡遠程運行它,我得到:

警告:shmop_open()[function.shmop開]:無法在第6行的/var/www/html/prof/phpsm.php中附加或創建共享內存段

...其中第6行是我上面顯示的行。

由於它運行良好,當我作爲根從服務器運行它時,我假設某處阻止了Web用戶請求連接到共享內存。

有誰知道可能是什麼原因造成的?

感謝

+0

平臺是...? – 2010-11-15 17:05:31

+0

這是Linux的紅帽。 – Columbo 2010-11-15 17:08:24

回答

1

問題是SELinux禁止的SHM訪問(您可以通過運行setenforce 0,測試和運行後setenforce 1驗證),但我不知道解決它比修改其他的好辦法該策略或切換到mmap。

+0

謝謝。 setenforce 0給了我'setenforce()失敗的迴應',但我會再看看它現在你給了我一些繼續。 – Columbo 2010-11-15 17:48:21

+0

它正在運行,如果我做sestatus它告訴我SELinux已啓用,但儘管有root訪問權限(通過SSH)它不會讓我執行任何更改。我試過'newrole -r sysadmn_r'來查看是否有幫助,但我只是得到:'newrole command not found'。 – Columbo 2010-11-15 18:05:35

+0

你說得對,這是SELinux,謝謝。 – Columbo 2010-11-18 09:30:22

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

我並最終通過去爲了讓它正確,但我在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;