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 : 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 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.