Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3090 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  Fork : lien entre les signaux et le terminal ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Fork : lien entre les signaux et le terminal ?

n°2281670
yellu
Posté le 18-05-2016 à 09:37:31  profilanswer
 

Bonjour à tous,
 
J'ai besoin d'un coup de main pour comprendre un comportement sur le petit script que j'ai codé ci-dessous :
 

Code :
  1. <?php
  2. $pid = pcntl_fork();
  3. if(!$pid) {
  4.    
  5.     // DAEMON DETACHEMENT EN SESSION LEADER DEVIENT UN DAEMON
  6.     posix_setsid();
  7.    
  8.     $nbChilds = 2;
  9.     $childs = array();
  10.    
  11.     for($i = 0; $i < $nbChilds; $i++) {
  12.        
  13.         $pid = pcntl_fork();
  14.        
  15.         if(!$pid) {
  16.            
  17.             // UN ENFANT DU DAEMON  
  18.             while(true) {
  19.                
  20.                 // INFINITE LOOP
  21.                
  22.             }
  23.            
  24.             exit(0); // SORTIE NORMALE
  25.            
  26.         } else {
  27.    
  28.             // DAEMON
  29.             $childs[$pid] = $pid;
  30.            
  31.         }
  32.        
  33.     }
  34.     // UN SIGNAL HANDLER QUI TUE LES ENFANTS
  35.     function signal_handler($signal) {
  36.        
  37.         global $childs;
  38.        
  39.         echo 'SIGNAL '.$signal.' CAUGHT'.PHP_EOL;
  40.        
  41.         foreach($childs as $pid) {
  42.            
  43.             posix_kill($pid, SIGKILL);
  44.            
  45.             echo 'SIGKILL '.$pid.PHP_EOL;
  46.            
  47.         }
  48.        
  49.         exit(1);
  50.        
  51.     }
  52.    
  53.     // HANDLER SUR LE SIGNAL 15
  54.     pcntl_signal(SIGTERM, 'signal_handler');
  55.    
  56.     // TANT QU IL RESTE DES CHILDS EN ROUTE
  57.     while(count($childs)) {
  58.        
  59.         // DISPATCH D UN EVENTUEL SIGNAL...
  60.         pcntl_signal_dispatch();
  61.        
  62.         // FIN EVENTUELLE D UN ENFANT...
  63.         $pid = pcntl_wait($status, WNOHANG);
  64.        
  65.         if($pid)
  66.             unset($childs[$pid]);
  67.        
  68.         // POUR NE PAS BOUCLER TROP RAPIDEMENT...
  69.         sleep(1);
  70.        
  71.     }
  72.     exit(0); // SORTIE NORMALE
  73.    
  74. } else {
  75.    
  76.     // PERE
  77.    
  78.     echo "CREATION DU DAEMON ".$pid.PHP_EOL;
  79.     echo "IL FAUT LE TUER AVEC UN : kill -15 ".$pid.PHP_EOL;
  80.    
  81.     exit(0); // SORTIE NORMALE
  82.    
  83. }


 
Le code ci-dessus, est à copier dans un fichier test.php, puis il faut le lancer en php-cli : php test.php
 
Le script va créer un daemon qui aura 2 enfants.
Si on tue le daemon via un "kill -15 PID", le daemon meurt et tue ses deux enfants grâce à un "signal_handler" que j'ai configuré via "pcntl_signal".
 
Si en revanche vous lancez le daemon puis que vous quittez votre terminal, puis revenez avec un nouveau terminal et tuez le daemon.
Alors à ce moment la, il ne tuera pas ses deux enfants, comme si le "signal_handler" n'était plus là.
 
Pourtant j'ai pris soins de positionner un "posix_setsid" afin de m'affranchir de tout lien avec la session courante.
 
Pourriez-vous m'aider à comprendre ce comportement ?
 
Merci d'avance.

mood
Publicité
Posté le 18-05-2016 à 09:37:31  profilanswer
 

n°2281691
rufo
Pas me confondre avec Lycos!
Posté le 18-05-2016 à 14:23:30  profilanswer
 

Ca viendrait pas du fait que la variable globale $childs est vide suite à la fermeture, la première fois, du terminal ?
 
Edit : tous les x tours de boucle principale, affiche les principales variables du script. Je pense que tu aura des surprises... :/


Message édité par rufo le 18-05-2016 à 14:24:08

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2281692
yellu
Posté le 18-05-2016 à 14:39:25  profilanswer
 

Bonjour,
 
Merci pour ta réponse, mais cela ne venait pas de là.
 
En fait, si on commente les echo dans le signal_handler, cela fonctionne même en killant avec un autre terminal.
 
Le signal_handler était donc bien appelé, mais le fait d'écrire dans la sortie standard d'un daemon sans terminal semblait poser problème...
 
Il y a surement une trace de log quelque part de l'erreur que cela générait, mais je ne la trouve pas.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  Fork : lien entre les signaux et le terminal ?

 

Sujets relatifs
lancer un lien sur une page web périodiquement[Bootstrap] Insérer un lien dans quelle partie du code ?
Masquer lien de téléchargementLien hypertexte dans un tableau à partir d'une base de données?
Signature Windows mail : ajouter adresse internet + lienLien sur image au survol ne prend qu'une partie de l'image
Generation lien utilisateurWordpress website vérolé - enlever lien footer
Problème d'image et de lien hypertextecliquer sur un lien pour lancer un script
Plus de sujets relatifs à : Fork : lien entre les signaux et le terminal ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR