セッションのIDがsetsid()
システムコールを介してセッションを作成したプロセスのpidと同じであることを読みましたが、プロセスグループIDの設定方法に関する情報は見つかりませんでした。プロセスグループIDは、プロセスグループを作成したプロセスのpidと同じですか?
一般に、はい。プロセスグループIDは、プロセスグループを作成したプロセスのプロセスIDと同じです。そのプロセスは、自分自身をグループに入れることによってプロセスグループを作成しました。
この情報は、setpgid
システムコールとそのバリアントsetpgrp
のドキュメントに記載されています。詳細は歴史的にBSDとSystem Vで異なります。最も一般的な使用例は次のとおりです。
setpgrp()
またはsetpgid(0, 0)
を使用して行うことができます。この場合、_0
_を明示的なgetpid()
で置き換えることができます。fork
とexecve
の間のコードによって実行されます子プロセス。プロセスは、同じセッションの既存のプロセスグループに自分自身を置きます。シェルはこれをパイプラインに対して実行します。独自のプロセスグループで_foo | bar
_を実行するために、シェルは通常、次のようなことを行います。
foo
を実行します。bar
を実行します。setpgid
の呼び出しは、子の代わりに、または子に加えて、親プロセスで実行できます。両方でこれを行うと、2番目の子の初期化が最初の子の初期化を追い越す場合の競合状態が回避されます。
ジョブ制御を備えたシェルは通常、独自のプロセスグループで実行されます。ただし、終了または一時停止する前に、元のプロセスグループに戻ります(つまり、グループがまだ存在すると想定して、プロセスグループを開始したプロセスグループに戻します)。
setpgid
のPOSIX仕様 は、これらの使用例を説明しています。さらに、動作が保証されているものは他にはあまりないことも説明しています。特に、古いBSDシステムではプロセスが別のセッションのプロセスグループに参加したり、新しいPGIDを作成したりすることができましたが、これはほとんどの最近のシステム(最近のBSDを含む)には当てはまりません。