wait()
に相当するものはありません .通常、kill(pid, 0)
を使用してポーリングします。 戻り値 -1 と errno
を探します ESRCH
の プロセスが終了したことを示します。
更新: Linux カーネル 5.3 以降では、pid が終了したときに通知を受け取るためにポーリングできる、指定された pid の fd を作成する pidfd_open syscall があります。
BSD および OS X では、kqueue を EVFILT_PROC+NOTE_EXIT とともに使用して、まさにそれを行うことができます。ポーリングは必要ありません。残念ながら、Linux に相当するものはありません。
これまでのところ、Linux でこれを行う 3 つの方法を見つけました。
- ポーリング:
kill
を使用して、プロセスの存在を頻繁にチェックします。 または/proc/$pid
の存在をテストすることによって 、他のほとんどの回答と同様 ptrace
を使用する a3nmの回答のように、デバッガのようにプロセスにアタッチするシステムコールにより、プロセスが終了したときに通知を受け取りますnetlink
を使用するPROC_EVENT_EXIT
をリッスンするインターフェース メッセージ - このようにして、プロセスが終了するたびにカーネルがプログラムに通知し、正しいプロセス ID を待つだけです。これについて説明されているのは、インターネット上の 1 か所でしか見たことがありません。
恥知らずなプラグ:私は 3 つのいずれかを実行するプログラム (もちろんオープン ソース; GPLv2) に取り組んでいます。