2010-11-15 6 views
1

Je partage de la mémoire entre C++ et PHPImpossible d'accéder à PHP/C++ mémoire partagée sur le web

A la fin PHP je:

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

Où shid est un identifiant que j'ai créé avec ftok.

Tout cela fonctionne très bien quand je lance ce script PHP connecté en tant que root sur le serveur, mais lorsque je tente de l'exécuter à distance sur le web je reçois:

Attention: shmop_open() [function.shmop ouvert ]: impossible de joindre ou de créer un segment de mémoire partagée dans /var/www/html/prof/phpsm.php à la ligne 6

... où la ligne 6 est la ligne que j'ai montrée ci-dessus.

Comme tout fonctionne correctement lorsque je l'exécute à partir du serveur en tant que root, je suppose que quelque part empêche les requêtes des utilisateurs Web de se connecter à la mémoire partagée.

Est-ce que quelqu'un sait ce qui pourrait causer cela?

Merci

+0

Plate-forme est ...? –

+0

C'est Linux Red Hat. – Columbo

Répondre

1

Le problème est que SELinux bloque l'accès SHM (vous pouvez vérifier en exécutant setenforce 0, les tests et l'exécution setenforce 1 après), mais je ne sais pas une bonne façon de le résoudre autre que la modification la politique ou passer à mmap.

+0

Merci. setenforce 0 me donne la réponse 'setenforce() a échoué, mais j'y reviendrai maintenant que vous m'avez donné quelque chose à faire. – Columbo

+0

Il est en cours d'exécution si je fais sestatus il me dit SELinux est activé, mais en dépit d'avoir un accès root (via SSH), il ne me permettra pas d'effectuer des modifications. J'ai essayé 'newrole -r sysadmn_r' pour voir si cela aide, mais j'ai juste: 'newrole command not found'. – Columbo

+0

Vous aviez raison, c'était SELinux, merci. – Columbo

0

Juste pour ajouter à la réponse acceptée, je devais garder SELinux en mode application, donc je fini par faire ce qui suit pour permettre l'accès aux opérations de mémoire partagée en PHP:

  1. mis SELinux en mode permissif
  2. mis SELinux en mode "ne pas bloquer": -DB semodule (ce qui était important, parce que les opérations de shmop ne sont pas par défaut connecté)
  3. effacé sur /var/log/audit/audit.log
  4. exécuté le script incriminé avec des opérations de mémoire partagée
  5. généré un module selinux: audit2allow -a -M audit.log
  6. module installé: semodule -i audit.log.pp

je ne finissent par passer par quelques itérations de ceci pour bien le faire, mais ma politique finale sur CentOS 6 était:

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; 
Questions connexes