web-dev-qa-db-ja.com

プロセスをあるプロセスグループから別のプロセスグループに移動する方法、および各プロセスグループのプロセスを一覧表示する方法は?

これまでに学んだことに基づいて、端末には1つのセッションしかなく、セッションには1つ以上のプロセスグループがあり、プロセスグループには1つ以上のプロセスがあります。

次の画像はこれを示しています。

enter image description here

2つの質問があります:

  1. プロセスをあるプロセスグループから別のプロセスグループに移動するにはどうすればよいですか?
  2. 各プロセスグループのプロセスを一覧表示するにはどうすればよいですか?

編集:プログラムではなく、ターミナルからこれら2つのことを行う方法を意味します。

5
user259392

ユーザーまたは一般的なプログラマーの観点からは、プロセスをあるグループから別のグループに移動することはありません。プロセスグループの編成はシェルの仕事です。ジョブをインタラクティブに実行すると、シェルはそのジョブを独自のグループに配置します。これを行う主な目的は、ユーザーがを押したときにグループ全体(パイプライン内のすべてのプロセスなど)を強制終了することです。 Ctrl+C

より一般的には、プロセスグループによって可能になることの1つは、一連のプロセスをアトミックに強制終了することです。いくつかのプロセスをリストしてからそれらを強制終了しようとすると、それらの1つが間に分岐した可能性があります。プロセスグループを強制終了すると、フォークでビジー状態であっても、グループ内のすべてのプロセスが強制終了されます。

ユーザーまたはアプリケーションプログラマーとして時々やりたいことの1つは、独自のグループで新しいプロセスを実行することです。それを行うためのユーザーレベルのコマンドはありません。インタラクティブシェルを起動することでそれを行うことができます。 (複雑な例については、 シェルスクリプトでのタイムアウト を参照してください。) timeoutユーティリティ from GNU coreutilsとLinux、および setsidユーティリティ 操作の一部として新しいプロセスグループを作成するutil-linuxスイートから。

プロセスを別のプロセスグループに移動するためのシステムコールは setpgid です。 (setpgrpと呼ばれる部分的なエイリアスもあります。)制限があります。プロセス自体またはその親によってのみ呼び出すことができ、ターゲットグループは元のグループと同じセッションにある必要があります。プロセスをあるグループから別のグループに任意に移動することはできません。

グループ内のプロセスを列挙する特定の方法はありません。できることは、すべてのプロセスを列挙し、その特定のグループ内のプロセスを選択することだけです。 ps列を含めることで、pgid出力にプロセスグループを一覧表示できます(例:ps -e -o pid,ppid,pgid,args)。