私は SIGCHLD ハンドラーを作成していますが、waitpid() を呼び出すとどのような条件で -1 が返されるのでしょうか?
より具体的には、waitpid(...) を呼び出すループを作成し、終了したすべての子プロセスが取得されるまでループを実行したい場合、waitpid(...) が -1 を返すまで繰り返しますか? そうでなければ、刈り取りが必要な子供が他にいるかどうかをどうやって知ることができますか?
waitpid()
-1
これらの状況下で戻ることができます:
errno
は に設定されます。ECHILD
すべての子またはプロセス グループ内のすべての子を取得するためにループしている場合 (つまり、またはに設定pid
した場合)、これが発生したときにループから抜け出す必要があります。これは、シグナル アクションが に設定されているか、シグナルのフラグが設定されている場合にも発生する可能性があります。-1
0
SIGCHLD
SIG_IGN
SA_NOCLDWAIT
options
引数にある場合は、errno
に設定されEINVAL
ます。が(特定の子を待っているpid
)よりも大きく、0
存在しないか、このプロセスの子ではない場合、errno
に設定されECHILD
ます。待機ループにいる場合、これはおそらく当てはまりません。これらは通常、コードに問題があることを示しており、おそらく報告するかログに記録して終了する必要があります。errno
に設定されEINTR
ます。これが発生した場合、おそらくループにとどまる必要があります。