これまでに学んだことに基づいて、端末には1つのセッションしかなく、セッションには1つ以上のプロセスグループがあり、プロセスグループには1つ以上のプロセスがあります。
次の画像はこれを示しています。
2つの質問があります:
編集:プログラムではなく、ターミナルからこれら2つのことを行う方法を意味します。
ユーザーまたは一般的なプログラマーの観点からは、プロセスをあるグループから別のグループに移動することはありません。プロセスグループの編成はシェルの仕事です。ジョブをインタラクティブに実行すると、シェルはそのジョブを独自のグループに配置します。これを行う主な目的は、ユーザーがを押したときにグループ全体(パイプライン内のすべてのプロセスなど)を強制終了することです。 Ctrl+C。
より一般的には、プロセスグループによって可能になることの1つは、一連のプロセスをアトミックに強制終了することです。いくつかのプロセスをリストしてからそれらを強制終了しようとすると、それらの1つが間に分岐した可能性があります。プロセスグループを強制終了すると、フォークでビジー状態であっても、グループ内のすべてのプロセスが強制終了されます。
ユーザーまたはアプリケーションプログラマーとして時々やりたいことの1つは、独自のグループで新しいプロセスを実行することです。それを行うためのユーザーレベルのコマンドはありません。インタラクティブシェルを起動することでそれを行うことができます。 (複雑な例については、 シェルスクリプトでのタイムアウト を参照してください。) timeout
ユーティリティ from GNU coreutilsとLinux、および setsid
ユーティリティ 操作の一部として新しいプロセスグループを作成するutil-linuxスイートから。
プロセスを別のプロセスグループに移動するためのシステムコールは setpgid
です。 (setpgrp
と呼ばれる部分的なエイリアスもあります。)制限があります。プロセス自体またはその親によってのみ呼び出すことができ、ターゲットグループは元のグループと同じセッションにある必要があります。プロセスをあるグループから別のグループに任意に移動することはできません。
グループ内のプロセスを列挙する特定の方法はありません。できることは、すべてのプロセスを列挙し、その特定のグループ内のプロセスを選択することだけです。 ps
列を含めることで、pgid
出力にプロセスグループを一覧表示できます(例:ps -e -o pid,ppid,pgid,args
)。