12

Linux OSで親プロセスの停止を検出するにはどうすればよいですか?

と呼ばれる親プロセスにある場合fork()、それは子プロセスを作成します。親プロセスでは、システムコールを使用wait()して、終了した子プロセスを待機し、そのステータスを取得できます。

しかし、子プロセスが親プロセスの死をどのように検出できるかについての情報を見つけることができませんか?

4

3 に答える 3

9

親プロセス ID を取得するには、 を呼び出しgetppid()てから、 を介してシグナル 0 を送信しkill()ます。戻りコード 0 は、プロセスがまだ生きていることを示します。

@Ariel で述べたようgetppid()に、元の親の pid または init の pid を返します。これは pid 1 になります。したがってgetppid()、起動時に呼び出して親 pid を保存するか、後で親が pid 1 であるかどうかを確認する必要があります。

Linux でのこの回答によると、prctl()PR_SET_PDEATHSIGオプションと自己選択したシグナルを介して親の死を検出することもできます。

于 2012-08-30T09:18:08.263 に答える
5

親プロセスと子プロセスの両方が存続期間中あなたの管理下にある場合、最も移植性の高い方法は、パイプまたはソケットの半分を親と共有することです。

  1. fork の前に、pipe() または socketpair() を開きます。
  2. フォークの後、
    1. 親で、パイプの読み取り側または最初のソケットを閉じます。
    2. 子では、パイプの書き込み側、または 2 番目のソケットを閉じます。
  3. 親では、残りのファイル記述子を隠して、それを忘れてください。
  4. 子では、多重化された IO メソッド (select、poll など) のいずれかを使用して、記述子の読みやすさをテストします。
  5. 記述子が読み取り可能になった場合、親はほぼ確実に死んでいるか、いくつかのまれなバグが原因で迷走書き込みが発生しており、read() を呼び出すことで確認できます。親が本当に死んでいた場合、read() は 0 バイトを返します。

この方法の利点は、UNIX で最も習得が難しいメカニズムの 1 つであるシグナルを完全に回避し、ネットワーク マルチプレクサまたは GUI イベント ループと簡単に統合できる待機可能な記述子を提供することです。

于 2019-06-26T20:44:14.137 に答える
3

私のUbuntu 16.04.1 LTSでは、getppid()は「1」を返しませんが、親のキル後にプロセス「/sbin/upstart --user」のIDを返すため、getppid() == 1のチェックは機能せず、getppid()を保存する必要があります子の開始時と後で比較されます。

于 2016-12-06T13:33:45.257 に答える