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 :
- <?php
- $pid = pcntl_fork();
- if(!$pid) {
-
- // DAEMON DETACHEMENT EN SESSION LEADER DEVIENT UN DAEMON
- posix_setsid();
-
- $nbChilds = 2;
- $childs = array();
-
- for($i = 0; $i < $nbChilds; $i++) {
-
- $pid = pcntl_fork();
-
- if(!$pid) {
-
- // UN ENFANT DU DAEMON
- while(true) {
-
- // INFINITE LOOP
-
- }
-
- exit(0); // SORTIE NORMALE
-
- } else {
-
- // DAEMON
- $childs[$pid] = $pid;
-
- }
-
- }
- // UN SIGNAL HANDLER QUI TUE LES ENFANTS
- function signal_handler($signal) {
-
- global $childs;
-
- echo 'SIGNAL '.$signal.' CAUGHT'.PHP_EOL;
-
- foreach($childs as $pid) {
-
- posix_kill($pid, SIGKILL);
-
- echo 'SIGKILL '.$pid.PHP_EOL;
-
- }
-
- exit(1);
-
- }
-
- // HANDLER SUR LE SIGNAL 15
- pcntl_signal(SIGTERM, 'signal_handler');
-
- // TANT QU IL RESTE DES CHILDS EN ROUTE
- while(count($childs)) {
-
- // DISPATCH D UN EVENTUEL SIGNAL...
- pcntl_signal_dispatch();
-
- // FIN EVENTUELLE D UN ENFANT...
- $pid = pcntl_wait($status, WNOHANG);
-
- if($pid)
- unset($childs[$pid]);
-
- // POUR NE PAS BOUCLER TROP RAPIDEMENT...
- sleep(1);
-
- }
- exit(0); // SORTIE NORMALE
-
- } else {
-
- // PERE
-
- echo "CREATION DU DAEMON ".$pid.PHP_EOL;
- echo "IL FAUT LE TUER AVEC UN : kill -15 ".$pid.PHP_EOL;
-
- exit(0); // SORTIE NORMALE
-
- }
|
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.