プロセスグループIDはどのように設定されますか?

プロセスグループIDはどのように設定されますか?

セッションのIDがシステムコールを介してセッションを作成したプロセスのpidと同じであることが判明しましたsetsid()が、プロセスグループIDの設定方法に関する情報が見つかりませんでした。プロセスグループIDは、プロセスグループを作成したプロセスのpidと同じですか?

ベストアンサー1

一般的に言えば、プロセスグループIDは、プロセスグループを作成したプロセスのプロセスIDと同じであり、そのプロセスは自分自身をグループに入れてプロセスグループを作成しました。

setpgidシステムコールとそのバリエーションに関するドキュメントでこの情報を見つけることができますsetpgrp。詳細は歴史的にBSDとSystem Vの間で異なっていました。最も一般的なユースケースは次のとおりです。

  • プロセスは、PIDと同じ新しいPGIDを使用して、独自のプロセスグループに自分自身を配置します。これはsetpgrp()SysVまたはを使用して行うことができsetpgid(0, 0)、どちらかを0明示的に置き換えることができますgetpid()
    参考にしてください。プロセス自分をグループに入れてください。実際、これは通常、実行前にランチャー(シェルまたはデーモンモニター)によって行われます。プログラムforkつまり、execve子プロセス間と子プロセス内の実行プログラムのコードで実行されます。
  • プロセスは、同じセッション内の既存のプロセスグループに配置されます。シェルはパイプに対して次のことを行います。独自のプロセスグループで実行するために、foo | barシェルは通常次のことを行います。

    1. パイプラインを設定します。
    2. プロセスをフォークします。子プロセスは自分自身を独自のプロセスグループに入れます。G、パイプの読み取り終了を閉じ、書き込み終了をstdoutに移動してから実行しますfoo
    3. プロセスをフォークします。子プロセスは自分を既存のプロセスグループに配置します。G、パイプの書き込み端を閉じ、赤い端を標準入力に移動してから実行しますbar

    親プロセスへの呼び出しは、子プロセスのsetpgid代わりに親プロセスで実行することも、子プロセスに加えて親プロセスで実行することもできます。両方を実行すると、2 番目の子の初期化が 1 番目の子の初期化を超えた場合に競合状態を回避できます。

  • ジョブ制御機能を持つシェルは通常、独自のプロセスグループで実行されます。ただし、終了または中断する前に元のプロセスグループに戻ります。つまり、そのグループがまだ存在すると仮定し、自分を起動したプロセスグループに戻します。

これPOSIX仕様setpgidこれらのユースケースについて説明します。また、他の方法は、動作が保証されないことを説明している。特に、以前のBSDシステムでは、プロセスが他のセッションのプロセスグループに参加したり、新しいPGIDを形成したりすることができましたが、ほとんどの最新システム(最新のBSDを含む)ではそうではありません。

おすすめ記事