GNU/Linux >> Linux の 問題 >  >> Linux

親プロセスの死を検出する

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

<オール>
  • フォークする前に、pipe() または socketpair() を開きます。
  • フォークの後、 <オール>
  • 親で、パイプの読み取り側または最初のソケットを閉じます。
  • 子で、パイプの書き込み側または 2 番目のソケットを閉じます。
  • 親では、残りのファイル記述子を隠して、それを忘れてください。
  • 子では、多重化された IO メソッド (select、poll など) のいずれかを使用して、記述子の読みやすさをテストします
  • 記述子が読み取り可能になった場合、親はほぼ確実に死んでいるか、いくつかのまれなバグが原因で迷走書き込みが発生しており、read() を呼び出して確認できます。親が本当に死んでいた場合、read() は 0 バイトを返します。
  • この方法の利点は、UNIX で最も習得が難しいメカニズムの 1 つであるシグナルを完全に回避し、ネットワーク マルチプレクサまたは GUI イベント ループと簡単に統合できる待機可能な記述子を提供することです。


    getppid() を呼び出すと、親プロセス ID を取得できます。 kill() 経由でシグナル 0 を送信する .戻りコード 0 は、プロセスがまだ有効であることを示します。

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

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


    Linux
    1. 親が初期化されているプロセスを強制終了する方法は?

    2. なしでCPUを食べるプロセスを検出する:Top、Htop、Ps?

    3. プログラムで別のプロセスの親 pid を取得しますか?

    1. CHILD PROCESSから戻り値を取得するには?

    2. ゾンビプロセスを強制終了する方法

    3. 親プロセスから子プロセスを取得する方法

    1. パイプの反対側にあるプロセスを見つける

    2. Linux でこのプロセスを強制終了できないのはなぜですか?

    3. fork() のコピーオンライトは複数のフォークをどのように処理しますか?