グループIDが1のサブアイテムにwaitpidを使用する

グループIDが1のサブアイテムにwaitpidを使用する

たくさん検索しましたが、解決策が見つかりませんでした。だからこれは愚かな質問かもしれません。

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を持つことになります。

関連情報