子プロセス以外のプロセスの終了を待つ方法

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) に取り組んでいます。