web-dev-qa-db-ja.com

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

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

8
user7681202

一般に、はい。プロセスグループIDは、プロセスグループを作成したプロセスのプロセスIDと同じです。そのプロセスは、自分自身をグループに入れることによってプロセスグループを作成しました。

この情報は、setpgidシステムコールとそのバリアントsetpgrpのドキュメントに記載されています。詳細は歴史的にBSDとSystem Vで異なります。最も一般的な使用例は次のとおりです。

  • プロセスはそれ自体を独自のプロセスグループに入れ、新しいPGIDはPIDと等しくなります。これは、SysV setpgrp()またはsetpgid(0, 0)を使用して行うことができます。この場合、_0_を明示的なgetpid()で置き換えることができます。
    processが自分自身をグループに入れている間、実際には、これはしばしばランチャー(シェル、またはデーモンモニター)プログラムを実行する前に、つまり、ランチャーのforkexecveの間のコードによって実行されます子プロセス。
  • プロセスは、同じセッションの既存のプロセスグループに自分自身を置きます。シェルはこれをパイプラインに対して実行します。独自のプロセスグループで_foo | bar_を実行するために、シェルは通常、次のようなことを行います。

    1. パイプを設置します。
    2. プロセスをフォークします。子は自身を自身のプロセスグループ[〜#〜] g [〜#〜]に配置し、パイプの読み取り側を閉じて書き込みを移動しますstdoutで終わり、次にfooを実行します。
    3. プロセスをフォークします。子はそれ自体を既存のプロセスグループ[〜#〜] g [〜#〜]に入れ、パイプの書き込み側を閉じ、赤を移動しますstdinで終わり、次にbarを実行します。

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

  • ジョブ制御を備えたシェルは通常、独自のプロセスグループで実行されます。ただし、終了または一時停止する前に、元のプロセスグループに戻ります(つまり、グループがまだ存在すると想定して、プロセスグループを開始したプロセスグループに戻します)。

setpgidのPOSIX仕様 は、これらの使用例を説明しています。さらに、動作が保証されているものは他にはあまりないことも説明しています。特に、古いBSDシステムではプロセスが別のセッションのプロセスグループに参加したり、新しいPGIDを作成したりすることができましたが、これはほとんどの最近のシステム(最近のBSDを含む)には当てはまりません。