0

私は SIGCHLD ハンドラーを作成していますが、waitpid() を呼び出すとどのような条件で -1 が返されるのでしょうか?

より具体的には、waitpid(...) を呼び出すループを作成し、終了したすべての子プロセスが取得されるまでループを実行したい場合、waitpid(...) が -1 を返すまで繰り返しますか? そうでなければ、刈り取りが必要な子供が他にいるかどうかをどうやって知ることができますか?

4

1 に答える 1

2

waitpid()-1これらの状況下で戻ることができます:

  1. プロセスには、まだ待機していない子はありません。この場合errnoは に設定されます。ECHILDすべての子またはプロセス グループ内のすべての子を取得するためにループしている場合 (つまり、またはに設定pidした場合)、これが発生したときにループから抜け出す必要があります。これは、シグナル アクションが に設定されているか、シグナルのフラグが設定されている場合にも発生する可能性があります。-10SIGCHLDSIG_IGNSA_NOCLDWAIT
  2. 引数に問題が検出されました。問題がoptions引数にある場合は、errnoに設定されEINVALます。が(特定の子を待っているpid)よりも大きく、0存在しないか、このプロセスの子ではない場合、errnoに設定されECHILDます。待機ループにいる場合、これはおそらく当てはまりません。これらは通常、コードに問題があることを示しており、おそらく報告するかログに記録して終了する必要があります。
  3. コールがシグナルによって中断されました。errnoに設定されEINTRます。これが発生した場合、おそらくループにとどまる必要があります。
于 2014-07-05T13:00:10.773 に答える