PHPの子プロセスとシグナル部分2


  • 分岐されたプロセスのシグナルがpcntl_wait() , それはうまく処理されるuntilsのままです.(一旦処理されると、後では動作しないでしょう.pcntl_wait() )
  • その中で、親プロセスを殺して子供を殺す時に何が起こるかについて話しました.この部分で、私たちが逆の順序でプロセスを殺すならば、何が起こるかについて話します.
    pcntl_async_signals(true);
    
    pcntl_signal(SIGTERM, function ($signal, $status) {
        echo "inside pcntl_signal\n";
        $pid = pcntl_wait($processStatus, WUNTRACED);
    //    $pid = pcntl_wait($processStatus, WNOHANG);
    
        if (pcntl_wifexited($processStatus)) {
            $code = pcntl_wexitstatus($processStatus);
            print "pid $pid returned exit code: $code\n ";
        } else {
            print "$pid was unnaturally terminated\n ";
        }
    //    print_r($processStatus);
    //    echo "\n";
    //    echo "signal: $signal\n";
    //    print_r($status);
    });
    if ($pid = pcntl_fork()) {
        $parent = getmypid();
        echo "parent: $parent\n";
    
        sleep(60);
    } else {
        $childPid = getmypid();
        echo "child pid: $childPid\n";
    
        sleep(60);
    }
    
    上記のスクリプトを実行し、プロセスPIDの出力に従って、最初の使用kill 親プロセスをkillし、子プロセスをkillするコマンド.出力は以下のようになります:
    parent: <parent pid>
    child pid: <child pid>
    inside pcntl_signal
    pid -1 returned exit code: 0
    inside pcntl_signal
    pid <child pid> returned exit code: 0
    
    我々はまだ2つのプロセス、1つの親、1つの子を作成します.子プロセスをkillし、子プロセスのシグナルハンドラを呼び出す.しかしpcntl_wait() 親プロセスで呼び出されたときのみ動作するので、- 1を返す.そして、私たちは、この時、親を殺しますpcntl_wait() 親プロセスで子プロセスのステータス情報を正常に処理します.しかし、これは注目すべき点を発生させます.pcntl_wait() 子プロセスで親プロセスが正常に終了するまで待機します.