2017-03-17 3 views
0

私はCでプログラムを書いています。フォークされた子プロセスでexecve()を実行して未知のアプリケーション(コマンドラインでユーザーが指定したもの)を実行するために、fork()をメインプロセスで行います。私は実行されたアプリケーションのプロセスのPIDを知っています - それはfork()によって返されますが、この未知のアプリケーションは何度もfork()することができますし、すべての子プロセスのPIDはわかりません(メインの親プロセスの孫です)。メインの親プロセスをチェックするにはどうすればいいですかいつ子プロセス(それは未知のアプリケーションです)とALL未知のアプリケーション出口の子ですか? (私は子供がどれくらいいるか分からず、これらの子供のPIDも知らない)。Linuxプロセスとそのすべての子プロセスがいつ終了するかを確認するにはどうすればよいですか?

+1

[親プロセスから子プロセスを取得する方法](http://stackoverflow.com/questions/17743879/how-to-get-child-process-from-parent-process) – klutt

+0

私はかわいいです確かにあなたはそれを通常の手段で行うことはできません。多分 'ptrace'を含む何か? – melpomene

+0

アプリはその子を処理する必要があります。あなたはそれらについて心配する必要はありません。 – PSkocik

答えて

3

これは、親プロセスをサブリカーにすることで実行できます。下位派は子孫によって孤立したすべての子を取得します。子孫は、通常は常にinit(プロセスID 1)に移動します。興味のある子プロセスをフォークする前に、サブリバーのステータスを有効にする必要があります。これが完了すると、waitpid()または同様の呼び出しは、ツリー全体がなくなったときにエラー[ECHILD]を返すまで、子プロセスとすべての孤立した子孫を返します。

Linuxの

、これはprctl()PR_SET_CHILD_SUBREAPERオプションを使用して有効になっているとFreeBSD上で、これは(詳細については、manページを参照してください)procctl()PROC_REAP_ACQUIREコマンドを使用して有効になっています。

Linuxでは、このように1つの子プロセスのみを監視することができます。なぜなら、孤児は元のフォークコールから孤立したものを覚えていないからです。 FreeBSDでは、PROC_REAP_GETPIDSは個々のサブツリーを区別することができますが、ツリーには多くのプロセスが含まれていると効率的ではありません。

+0

ありがとう@jilles!それは私が探していたようだ。やってみます。 BTW:この説明も便利です:http://unix.stackexchange.com/questions/250153/what-is-a-subreaper-process – dluki

+0

これはそれです - 素晴らしい作品です - ありがとう! :-) – dluki

-1

1つの子が終了したかどうかを知るために、waitpid(-1、NULL、WNOHANG)を使用できます。正の数(pid)を受け取った場合、1人の子供が出た。親プロセスには、子プロセスが終了したかどうかを確認するためにこのコマンドを使用している場合、xという子プロセスの量が0より大きいかどうかを確認する行があります。 x個のアイテムがある場合は、アイテムの増分xを追加するときと、減分xを終了するときに増分します。あなたが持っている子供の数xがゼロのとき、あなたの子供たちはすべて殺されました。

+0

質問は主なプロセスの子供ではなく、孫についてです。 – melpomene

+0

@melpomeneまさに。 – dluki

+0

@Charles私はexecve()(私の孫たち)を使って実行した未知のアプリケーションのすべての子が終了するときを知りたい。私はこの未知のアプリがどれくらいの数の子供が持つことができるか分からず、これらの子供のPIDも知らない。 – dluki

関連する問題