たくさん検索しましたが、解決策が見つかりませんでした。だからこれは愚かな質問かもしれません。
waitpidの形式は次のとおりです。
pid_t waitpid (pid_t pid, int *status, int options)
pidパラメーターは、待機するプロセスを正確に指定します。その価値は4つのキャンプに分かれています。
< -1
Wait for any child process whose process group ID is equal to the absolute value of this value.
-1
Wait for any child process. This is the same behavior as wait( ).
0
Wait for any child process that belongs to the same process group as the calling process.
> 0
Wait for any child process whose pid is exactly the value provided.
問題は、親と子のグループIDが異なり、子のグループIDが1の場合はどうなりますか?この特定の子供のためにwaitpidをどのように使用できますか? -1 が使用できないため、子を待つように指示します。
答え1
プロセスの子のみを待つことができます。
子プロセスがプロセスグループIDを変更した場合、新しいプロセスグループIDは一緒に負の数として使用できますwaitpid()
。
注:この機能はwaitpid()
1989年以来廃止されました。最新の機能は次のとおりです。waitid()
お気に入りの機能をサポートします。
waitid(idtype, id, infop, opts)
idtype_t idtype;
id_t id;
siginfo_t *infop; /* Must be != NULL */
int opts;
プロセスグループを待つには、次のようにします。
waitid(P_PGID, pgid, infop, opts);
したがって、実際にプロセスグループID 1にプロセスがある場合は、次のように呼び出します。
waitid(P_PGID, 1, infop, opts);
ただし、このプロセスグループIDはすでに使用されているため、pgid 1の下に子プロセスを持つにはinit
そのプロセスが必要です。init
しかし、waitid()
システムコールとして実装されておらず、廃止されましたwaitpid()
。
利点waitid()
は次のとおりです。
何を待つかを明示的に指定できます(例:P_PID P_PGID P_ALL)
子プロセスのパラメータの32ビットをすべて
exit(2)
親プロセスに返します。フラグ待機を許可:
WNOWAIT
サブプロセスは収集されず、後で使用するためにプロセステーブルに残ります。
注:siginfo_tポインタは、waitid()
信号処理関数の2番目のパラメータと同じですSIGCHLD
。
答え2
子プロセスのプロセスグループIDがあると、いくつかの問題が発生します1
。
プロセスグループは、主にフォアグラウンドプロセスとバックグラウンドプロセス(パイプ)を実行するシェルに使用されます。通常、新しいプロセスグループが起動すると、最初のプロセスのプロセスIDからプロセスグループIDが取得されます。 PID1の子が得られないので、PGID1の子も得られない。
このsetpgid()
呼び出しにより、プロセスをあるプロセスグループから別のプロセスグループに移動できますが、まだ同じ(ログイン)セッションの一部である必要があるため、この方法でもプロセスをPGID 1に移動することはできません。
PID 1で実行されるシェルがある場合は、おそらくPGID 1もあります。ただし、シェルが子のPGIDを変更するたびに、異なるPGIDを持つことになります。