GUIプロセスのプロセスグループ(セッション)

GUIプロセスのプロセスグループ(セッション)

私が知る限り、シェルとその子プロセスは同じ(制御)端末を使用して同じセッションにあります。同じ端末が接続されているので、インタラクティブなプロセスであることを読みました。今のところ、実際の対話がユーザーとシェルの間にあるので、正しくないと感じても大丈夫です。

GUIプログラム(ブラウザ、テキストエディタなど)、ウィンドウマネージャ、デスクトップ環境はどうですか? X11のサブプロセスですか?

修正:シェルの各コマンドパイプには異なるPGIDがあります。したがって、シェルの子プロセスには、シェルの子プロセスと同じPGIDはありません。

答え1

伝統的なUnixの概念会議テキスト端末のログインセッションに適しています。

X11セッション(例:会議特定のUnixの意味ではなく、一般的な意味では、すべてのプロセスは通常、セッションリーダープロセスの子孫です。これは、セッションマネージャー(存在する場合)、ウィンドウマネージャー、またはランチャー(グラフィックシェル)(存在する場合)です。 X11セッションを開始および終了するプロセスがあります。その役割はデスクトップ環境によって異なります。

pstree(基本インストールの一部ではない可能性があります)またはps axf(Linuxのみ)を使用してプロセスツリーを観察できます。 X サーバーは他のプログラムと同じツリーブランチに属しません。その役割は入力と出力を調整するだけで、プログラムの起動にはまったく参加しません。通常、aまたはxinitaが表示されます。ディスプレイマネージャ2つのサブエントリがあり、1つはXサーバー、もう1つはXセッションリーダーです。

一部のGUIプログラムは、親プロセスが終了した場合(たとえば、ラッパースクリプトによってバックグラウンドで開始された後に終了したため)、プロセスツリーに接続されない場合があります。


実際の対話はユーザーとシェルの間で行われます。

実際にシェルと対話する場合にのみ可能です。端末で実行されている他のプログラムと対話するときに関連するシェルはありません。入力と出力はプログラムと端末間で直接移動し、シェルはプログラムが終了または中断されるまでバックグラウンドで待機します。

答え2

編集:最初は質問を誤って読んでいました。

X windowsはディスプレイサーバーです。クライアントアプリケーションはメッセージを使用してサーバーと通信します。これらのプロセスには、すべての入力がXから来るため、通常は接続された端末はありません。アプリケーションに端末が必要な場合は、擬似端末が作成され、アプリケーションに接続されます。たとえば、gnome-shell は pty を生成し、bash に関連付けます。

ソース:シェル(ジョブ制御が有効になっている状態)は、自分が作成する各子プロセスのプロセスグループを作成します。 x アプリケーションは x11 と通信します。つまり、x11 では実行されません。

答え3

すべての一般的なプロセス(GUIプロセスを含む)は、自分をセッションリーダーとして宣言できます(たとえば、os.setpgrp()元の会話グループではなく)(もちろん会議ホストになるプロセスを除く)、新しいセッショングループのpgidは通常(または常に100 % わかりません) 自分をセッションリーダーと呼ぶプロセスの pid です。

実際の例は次のとおりです。

$ ps -eo pid,ppid,pgid,tty,cmd | egrep "(PPID|konsole|Running)"
  PID  PPID  PGID TT       CMD
 4841  9633  4840 pts/3    grep -E (PPID|konsole|Running)
 7375     1  7374 pts/3    konsole -p name=ROOT -e su -
 9373     1  9373 ?        kdeinit4: kdeinit4 Running...
 9489     1  9373 ?        kdeinit4: konsole [kdeinit] -session 102172181df177000142160830700000083410009_14428560
 9492     1  9373 ?        kdeinit4: konsole [kdeinit] -session 102172181df177000142901958900000018140011_14428560
 9558     1  9373 ?        kdeinit4: konsole [kdeinit] -session 102112051ed1c6000144239124800000016680010_14428560

リストされているプロセスのほとんどはkonsoleKDE自体(pid 9373)によって開始され、対応するkdeinitpgid 9373を継承します。

ただし、konsolepid 7375(同じモニタに表示され、他のGUIアプリケーションと同様にKDEによって制御されます)は、他のkonsoleプロセスの1つで実行されているシェルで手動で起動されます。これはpgid 7374に属し、konsoleプロセス自体がフォークされたときに始まりました(もはや存在せず、その時点でセッションリーダーになった親pid 7374によって)。

制御端末とは無関係です(たとえば、これらのkonsoleプロセス内の各シェルには独自のttyがありますが、手動で開始されたkonsoleプロセスにのみpty / 3があり、祖先シェルから継承され、KDEから開始されたプロセスにはkonsolettyはありません)。

注:pid == pgid == 9373は、9373が自分自身をセッションリーダーと呼ぶプロセスでもあることを意味します。

関連情報