web-dev-qa-db-ja.com

waitpid、wnohang、wuntraced。これらの使用方法

私は少し混乱しています。私が理解しているように、pidが-1のwaitpidは、すべての子供が完了するのを待つことを意味しますが、WNOHANGのwaitpidにオプションを追加すると、何も完了していない場合、すぐに終了するように指示されます...これらは非常に混乱しているようです。

子プロセスが終了するのを待つようにコンピューターに指示し、その後すぐに子プロセスが終了していない場合はすぐに終了するように指示するのはなぜですか?

誰かがこのオプションとWUNTRACEDオプションを説明できますか?トレースすることの意味がわかりません。

13
8this

_-1_とWNOHANGを渡すと、waitpid()はゾンビの子供が存在するかどうかを確認します。はいの場合、そのうちの1つが刈り取られ、終了ステータスが返されます。存在しない場合は、_0_が返される(終了していない子が存在する場合)または_-1_が返される(存在しない場合)ERRNOECHILD(子プロセスなし)に設定されます。これは、子供の1人が死ぬのを待たずに最近死んだかどうかを知りたい場合に便利です。この点で非常に便利です。

オプションWUNTRACEDは以下のように文書化されています。この説明に追加するものはありません。

WUNTRACED停止したpidで指定され、停止してからステータスがまだ報告されていない子プロセスのステータスも、要求元プロセスに報告されます。

詳細については [〜#〜] posix [〜#〜] から waitpid ページを読んでください。

5
fuz

通常、WNOHANGとWUNTRACEDは異なるケースで使用します。

ケース1:多数の子を生成し、子の実行中に他の処理を行う必要があるプロセスがあるとします。これらの子は時々終了するか、強制終了されますが、カーネルは、他のプロセスがwait()またはwaitpid()を介して要求するまで、終了ステータスを保持します。そのため、親プロセスは、ときどきwait()/ waitpid()を呼び出して、カーネルが子の残りを削除するようにする必要があります。ただし、wait()/ waitpid()をblockにしたくないのは、この場合、プロセスには他に必要なことがあるためです。デッドプロセスのステータスを収集するだけですifがあります。それがWNOHANGの目的です。プロセスが他のタスクを続行できるように、wait()/ waitpid()がブロックされないようにします。子が死亡した場合、そのpidはwait()/ waitpid()によって返され、プロセスはそれに基づいて動作できます。何も死ななかった場合、返されるpidは0です。

ケース2:代わりに、子の実行中に親プロセスがnothingを実行したいとします。ループを親指でぐるぐる回すだけではいいのではないので、WNOHANGなしで通常のwait()/ waitpid()を使用します。子の1つが死ぬまで、プロセスは実行キューから取り出されます。しかし、もしあなたの子供の一人がSIGSTOP経由で停止だったらどうでしょうか?あなたの子供はあなたが設定したタスクに取り組んでいないが、親はまだ待っている。つまり、ある意味で、親とその子の外部の何らかの手段で子が継続されない限り、デッドロックが発生します。 WUNTRACEDを使用すると、子が停止になり、終了または強制終了された場合に、親がwait()/ waitpid()から返されます。このようにして、親はSIGCONTを送信して続行し、強制終了し、タスクを別の子に割り当てることができます。

32
Jemenake