pcntl_waitpid()によって返された$ statusを使用するにはどうすればよいですか?
-
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()
.
所属していません StackOverflow