子プロセスの場合、wait()
およびwaitpid()
関数を使用して、子プロセスが終了するまで現在のプロセスの実行を中断できます。ただし、この関数は子プロセス以外には使用できません。
プロセスの終了を待つことができる別の機能はありますか?
に相当するものはありませんwait()
。通常の方法は、プロセスが終了したことを示すkill(pid, 0)
ために、戻り値 -1 とerrno
ofを使用してポーリングすることです。ESRCH
更新: Linux カーネル 5.3 以降、pid が終了したときに通知を取得するためにポーリングできる、指定された pid の fd を作成するpidfd_open syscall があります。
BSDおよびOSXでは、EVFILT_PROC+NOTE_EXITでkqueueを使用して正確にそれを行うことができます。ポーリングは必要ありません。残念ながら、Linuxに相当するものはありません。
ソケットまたは FIFO を作成して、それらを読み取ることもできます。FIFO は特に単純です。子の標準出力を FIFO に接続して読み取ります。読み取りは、子プロセスが (何らかの理由で) 終了するか、何らかのデータを発行するまでブロックされます。そのため、不要なテキスト データを破棄するための小さなループが必要になります。
子のソースにアクセスできる場合は、開始時に FIFO を書き込み用に開き、その後は単に忘れてください。子が終了すると、OS は開いているファイル記述子を消去し、待機中の「親」プロセスが起動します。
これは、あなたが開始または所有していないプロセスである可能性があります。その場合、バイナリ実行可能ファイルを、実際のバイナリを開始するスクリプトに置き換えることができますが、上で説明したように監視も追加します。
でプロセスにアタッチできますptrace(2)
。シェルから、strace -p PID >/dev/null 2>&1
動作するようです。これによりビジー待機が回避されますが、トレースされたプロセスが遅くなり、すべてのプロセスで機能するわけではありません (自分のプロセスのみで、子プロセスのみよりも少し優れています)。
Linux カーネル 5.3 以降では、pid が終了したときに通知を取得するためにポーリングできる、指定された pid の fd を作成するpidfd_open syscall があります。
私が知っているものはありません。カオスからの解決策とは別に、待ちたいプログラムを変更できるのであれば、セマフォを使用できます。
ライブラリ関数はsem_open(3)
、sem_init(3),
sem_wait(3),
...
sem_wait(3)
は待機を実行するので、カオスのソリューションのように忙しい待機を行う必要はありません。もちろん、セマフォを使用するとプログラムがより複雑になり、手間をかける価値がない場合があります。
/proc/[pid] または /proc/[pid]/[something] が消えるのを待つことは可能でしょうか?
poll() およびその他のファイルイベント待機関数がありますが、それが役立つ可能性がありますか?