2017-12-20 12 views
0

子プロセスの1つP 'から特定のプロセスPのプロセスステータスを取得しようとしています。Linuxで親プロセスの状態を取得する

私は関数waitpid()について知っていますが、ドキュメントでは、子プロセスのステータスをチェックするために使用されています。

他の方法はありますか?

+0

@Someprogrammerdude、 'waitpid()'は、指定されたpidが呼び出しプロセスの子ではないプロセスを識別すると、 'ECHILD'で失敗することを文書化されています。私はOPの実装がその点でバグである可能性は低いと思うが、そうであれば、そのようなバグに頼ることは確かに勧められないだろう。 –

+0

子プロセスの親プロセスが終了すると、孤立した子プロセスは 'init'にリホームされます。これは、親がもはや存在しないことを子供の中で検出するために使用することができる。現時点では、元の親プロセスに関する情報は長くなくなっています。 – tofro

答えて

2

プロセスがその親プロセスが終了するのを待つか、親プロセスの終了ステータスを取得するための標準機能はありません。プロセスツリーはちょうどそのようには機能しません。子供たちは彼らが出るときに両親に通知しますが、他の方法では通知しません。

したがって、子プロセスが親の死を知るようにするには、親がそれらに積極的に通知するよう手配しなければなりません。これはシグナリングの仕事のようです。親が正常に出た(つまり、main()から戻るか、exit()に電話をかける)ことを子供に知らせるだけでよい場合は、それだけで十分でしょう。信号を選択してください - おそらくSIGUSR1またはSIGUSR2 - 親のレジスタには、その信号を子に送るatexit()ハンドラがあります。それは、親がその子供を追跡することを必要としたり、必要としないことがあります。

ただし、親の終了ステータスを取得することに言及している限り、おそらくもう少し必要です。 2つ(またはそれ以上)の信号のどちらを送信するかを選択することで、子どもたちに大雑把な情報を得ることができますが、詳細な情報についてはIPCメカニズムが必要です。共有メモリやパイプ(またはそれらのいくつか)に終了ステータスを書き込んだり、ソケットやメッセージキューにメッセージを送信したり、普通のファイルにステータスを書き込んだり、あるいは私が考えなかった何か他のものを書き込んだりするかもしれません。

また、既存のモデルがかなりうまく動作し、40年後には完了したことを考慮する必要があります。実際にあなたのニーズを満たすことはできませんが、私はあなたが考えている設計が、Unixモデルにもっときちんと適合できるかどうかについて考えることをお勧めします。

+0

Thanks、clear and clean answer(y) – Mouley

+0

'atexit()'で登録された関数は、高速終了関数の1つを呼び出すのではなく、制御下でプログラムが停止した場合にのみ呼び出されることに注意してください。 –

+1

それは私が幾分敷物の下にプッシュした、良い観察、@ジョナサン・レフラーです。私は、親プロセスが 'exit()'を呼び出すか、 'main()'から戻ることで終了すると仮定したアプローチを規定しました。それが他の何らかの方法で終了する場合は、子供がそれについて聞くようにする前に、子供に通知する機械を明示的に実行する必要があります。それはすべての場合に起こることに依存することはできません。特に、「SIGKILL」を受け取った結果、親が死亡した場合は起こりません。 –

関連する問題