Bonjour à tous,
J'ai besoin d'un coup de main pour comprendre un comportement sur le petit script que j'ai codé ci-dessous :
Le code ci-dessus, est à copier dans un fichier test.php, puis il faut le lancer en php-cli : php test.php
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87 <?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 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.
Partager