セッションリーダーはそのグループの唯一のプロセスですか?

セッションリーダーはそのグループの唯一のプロセスですか?

次のAPUEの写真を見ると思います。プロセスセッションでは、セッションリーダーのプロセスグループにはセッションリーダーのみが含まれ、他のプロセスは含まれませんか?

  • 生成されたすべてのプロセスは、fork()親プロセスから同じプロセスグループとセッションを継承します。もしそうなら、セッションリーダーは自分のプロセスグループに好きなだけプロセスを分岐できますか?

  • たとえば、シェル(セッションリーダーの場合)はプロセスグループの唯一のプロセスですか?もしそうなら、シェルが子プロセスを分岐するとき、子プロセスは最初はシェルと同じプロセスグループにありますが、後で呼び出してすぐに新しいプロセスグループを起動します。setpgid()

ありがとうございます。

ここに画像の説明を入力してください。

答え1

いいえ、そのような制限はありません。この場合、ジョブ制御を実装しないコマンド(実際にはシェルのみを実行する)は、起動時にプロセスを分岐できません(サブプロセスがプロセスグループを継承するため)xterm -e that-command

セッションリーダーがジョブ制御を有効にした対話型シェルであっても、そのグループに異なるプロセスがある可能性があります。

ランニング:

xterm -e 'sleep 1000 & exec zsh'

そこxterm

  PID  PGID   SID TTY          TIME CMD
14003 14003 14003 pts/20   00:00:00 zsh
14004 14003 14003 pts/20   00:00:00 sleep
14012 14012 14003 pts/20   00:00:00 ps

ほとんどのコマンドは、別々のプロセスグループで実行される対話型シェルで実行されますが、すべてのコマンドはそうではありません。

たとえば、次のようになりますbash

$ exec 3< <(sleep 1000)
$ ps -j
  PID  PGID   SID TTY          TIME CMD
13913 13913 13913 pts/19   00:00:00 bash
14136 13913 13913 pts/19   00:00:00 bash
14137 13913 13913 pts/19   00:00:00 sleep
14138 14138 13913 pts/19   00:00:00 ps

または、プロンプト拡張の一部として開始されたプロセス:

$ PS1=$'$(ps -j)\n$ '
  PID  PGID   SID TTY          TIME CMD
14212 14212 14212 pts/18   00:00:00 bash
14292 14212 14212 pts/18   00:00:00 ps
$ 

答え2

すべての外部コマンドは、シェルとは異なるプロセスグループで実行されます。シェルはセッションリーダーなので、そのプロセスグループの唯一のプロセスです。

同じパイプラインに属するすべてのコマンドは同じプロセスグループにあります。

関連情報