Linux OSで親プロセスの停止を検出するにはどうすればよいですか?
と呼ばれる親プロセスにある場合fork()
、それは子プロセスを作成します。親プロセスでは、システムコールを使用wait()
して、終了した子プロセスを待機し、そのステータスを取得できます。
しかし、子プロセスが親プロセスの死をどのように検出できるかについての情報を見つけることができませんか?
親プロセス ID を取得するには、 を呼び出しgetppid()
てから、 を介してシグナル 0 を送信しkill()
ます。戻りコード 0 は、プロセスがまだ生きていることを示します。
@Ariel で述べたようgetppid()
に、元の親の pid または init の pid を返します。これは pid 1 になります。したがってgetppid()
、起動時に呼び出して親 pid を保存するか、後で親が pid 1 であるかどうかを確認する必要があります。
Linux でのこの回答によると、prctl()
のPR_SET_PDEATHSIG
オプションと自己選択したシグナルを介して親の死を検出することもできます。
親プロセスと子プロセスの両方が存続期間中あなたの管理下にある場合、最も移植性の高い方法は、パイプまたはソケットの半分を親と共有することです。
この方法の利点は、UNIX で最も習得が難しいメカニズムの 1 つであるシグナルを完全に回避し、ネットワーク マルチプレクサまたは GUI イベント ループと簡単に統合できる待機可能な記述子を提供することです。
私のUbuntu 16.04.1 LTSでは、getppid()は「1」を返しませんが、親のキル後にプロセス「/sbin/upstart --user」のIDを返すため、getppid() == 1のチェックは機能せず、getppid()を保存する必要があります子の開始時と後で比較されます。