あるプロセスグループから別のプロセスグループにプロセスを移動するにはどうすればよいですか?各プロセスグループのプロセスをどのようにリストしますか?

あるプロセスグループから別のプロセスグループにプロセスを移動するにはどうすればよいですか?各プロセスグループのプロセスをどのようにリストしますか?

これまで私が知っているところによれば、端末には1つのセッションだけがあり、セッションには1つ以上のプロセスグループがあり、プロセスグループには1つ以上のプロセスがあります。

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

ここに画像の説明を入力してください。

2つの質問があります。

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

編集する:プログラムではなく、端末でこれら2つのことを行う方法を意味します。

答え1

ユーザーまたは一般的なプログラマーの観点からは、プロセスをあるグループから別のグループに移動することはできません。プロセスグループを構成することはシェルの使命です。ジョブを対話的に実行すると、シェルはそのジョブを独自のグループに入れます。これの主な目的は、Ctrlユーザーが+を押したときにグループ全体(パイプ内のすべてのプロセス)を終了することですC

より一般的には、プロセスグループが実行できることの1つは、プロセスグループをアトミックに終了することです。一部のプロセスを一覧表示して終了しようとすると、プロセスの1つが途中で分岐する可能性があります。プロセスグループを終了すると、フォーク中であってもグループ内のすべてのプロセスも終了します。

ユーザーまたはアプリケーションプログラマーとして時々やりたいことの1つは、独自のグループで新しいプロセスを実行することです。この操作を実行するユーザーレベルのコマンドはありません。対話型シェルを起動すると、これを行うことができます。 (望むよりシェルスクリプトのタイムアウト複雑な例を見てみましょう。 ) および次のようなその他のコマンドtimeout便利GNU coreutilsとLinuxでsetsid便利タスクの一部として新しいプロセスグループを作成するutil-linuxファミリで。

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

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

関連情報