私は次の2つのソースから決定的に結論付けました:ShellのプロセスグループID =フォアグラウンドワークプロセスグループID。フォアグラウンドで実行するバックグラウンドジョブを選択すると、シェルのプロセスグループIDがフォアグラウンドジョブのプロセスグループIDに変更されますか、それともその逆に変更されますか?
1.
タスク制御ユーザーインターフェースの実装を容易にするために、オペレーティングシステムは現在の端末プロセスグループIDの概念を維持しています。このプロセスグループのメンバー(現在の端末のプロセスグループIDと同じプロセスグループIDを持つプロセス)は、SIGINTなどのキーボード生成信号を受け取ります。これらのプロセスは前景にあると言われています。バックグラウンドプロセスは、プロセスグループIDが端末プロセスグループIDと異なるプロセスである。これらのプロセスはキーボードから生成された信号の影響を受けません。(源泉)
2.
次に追加:
$sleep 3000 &
$sleep 2000 &
$ps xao pid,ppid,pgid,sid,tty,comm | grep tty
PID PPID PGID SID TTY COMMAND
1153 1135 1153 1153 tty1 bash
1173 1153 1173 1153 tty1 sleep
1189 1153 1189 1153 tty1 sleep
1219 1153 1219 1153 tty1 ps
1220 1153 1219 1153 tty1 grep
ベストアンサー1
私は次の2つのソースから決定的に結論付けました:ShellのプロセスグループID =フォアグラウンドワークプロセスグループID。
引用したソースのどれも、シェルのPGIDがフォアグラウンドジョブPGIDと同じであると主張していないため、これを行わないでください。
シェルのPGIDは変更されません。端末で対話型シェルを実行する場合、通常の状況では、シェルは独自のプロセスグループにあり、シェルのPGIDはシェルのPIDと同じです。
すべてのプロセスにはPGIDがあります。ターミナルに関連フォアグラウンドプロセスグループID。定義によると、フォアグラウンドプロセスグループはこのPGIDを持つプロセスグループです。
端末が端末エミュレータによって提供される場合、これは端末エミュレータプロセスのPIDとは関係がない。カーネルが完全に提供するハードウェア端末を考慮すると、これは明らかです。この場合、端末エミュレータプロセスはありません。
端末に関連付けられたPGIDを渡すことができます。tcsetpgrp
シェルがフォアグラウンドで外部プログラムを起動したとき、またはを使用してタスクをフォアグラウンドに移動したときに呼び出される関数fg
。