pcntl_waitpid()によって返された$ statusを使用するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/4586148

  •  14-10-2019
  •  | 
  •  

質問

親/労働者の取り決めが続いています。親は、ワーカーのピドをアレイに保ち、次のループでまだ生きていることを常に確認してください。

// $workers is an array of PIDs
foreach ($workers as $workerID => $pid) {
    // Check if this worker still exists as a process
    pcntl_waitpid($pid, $status, WNOHANG|WUNTRACED);

    // If the worker exited normally, stop tracking it
    if (pcntl_wifexited($status)) {
        $logger->info("Worker $workerID exited normally");
        array_splice($workers, $workerID, 1); 
    }

    // If it has a session ID, then it's still living
    if (posix_getsid($pid))⋅
        $living[] = $pid;
}

// $dead is the difference between workers we've started
// and those that are still running
$dead = array_diff($workers, $living);

問題はそれです pcntl_waitpid() 常に設定されています $status 0まで、そのため、このループが最初に実行されるのは、親は、まだ実行されているにもかかわらず、すべての子供が正常に終了したと考えています。私は使用していますか pcntl_waitpid() 誤って、またはそれがそうでないことをすることを期待していますか?

役に立ちましたか?

解決

簡単に言えば、子供は出て行ったり停止したりしていません。追加しました WNOHANG フラグ、そのため、常にすぐに戻ります(イベントを待たないように関数に指示します)。あなたがすべきことは、の返品値を確認することです pcntl_waitpid 価値のあるものが返されたかどうかを確認するには(ステータス変更がある場合にループの内容を実行するだけであると仮定します):

foreach ($workers as $workerID => $pid) {
    // Check if this worker still exists as a process
    if (pcntl_waitpid($pid, $status, WNOHANG|WUNTRACED)) {
        // If the worker exited normally, stop tracking it
        if (pcntl_wifexited($status)) {
            $logger->info("Worker $workerID exited normally");
            array_splice($workers, $workerID, 1); 
        }
        // If it has a session ID, then it's still living
        if (posix_getsid($pid))⋅
            $living[] = $pid;
    }
}    

他のヒント

あなたは確かに「使っています pcntl_waitpid() 間違っている」(引用符に注意)

あなたが使用しているので WNOHANG, それだけ もしも pcntl_waitpid() 子供のPIDを返し、何が入っているかを評価することができます $status.

見る 返品値 にとって pcntl_waitpid().

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top