次の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
すべての外部コマンドは、シェルとは異なるプロセスグループで実行されます。シェルはセッションリーダーなので、そのプロセスグループの唯一のプロセスです。
同じパイプラインに属するすべてのコマンドは同じプロセスグループにあります。