`ps`の「セッションリーダー」とは何ですか?

`ps`の「セッションリーダー」とは何ですか?

ps -dセッションリーダーを除くすべてのプロセスが選択されるセッションリーダーとは何ですか?

答え1

Linuxでは、各プロセスには次のような複数のIDが関連付けられています。

  • プロセスID(PID)

    これはプロセスを識別する任意の数です。各プロセスには一意のIDがありますが、プロセスが終了し、親プロセスが終了ステータスを取得した後に、新しいプロセスで再利用できるようにプロセスIDが解放されます。

  • 親プロセスID(PPID)

    これは単に問題のプロセスを開始したプロセスのPIDです。親プロセスが子プロセスの前に終了すると、子プロセスのPPIDは他のプロセス(通常PID 1)に変更されます。

  • プロセスグループID(PGID)

    これはプロセスグループリーダーのPIDにすぎません。 PID == PGIDの場合、このプロセスはプロセスグループのリーダーです。

  • セッションID(SID)

    これはセッションリーダーのPIDにすぎません。 PID == SIDの場合、プロセスはセッションリーダーです。

セッションとプロセスグループは、単に複数の関連プロセスを1つの単位として処理する方法です。プロセスグループのすべてのメンバーは常に同じセッションに属しますが、セッションは複数のプロセスグループを持つことができます。

通常、シェルはセッションリーダーになり、そのシェルで実行される各パイプはプロセスグループになります。これは、シェルがシャットダウンしたときにシェルの子を簡単に殺すことができるようにするためです。 (望むより出口(3)血まみれの詳細を取得します。 )

リーダーではなく、セッションやプロセスグループのメンバーを説明する特別な用語はないと思います。

答え2

セッションリーダーは、セッションID ==プロセスIDを持つプロセスです。これは人為的なように聞こえますが、セッションIDは子プロセスによって継承されます。 UNIX / Linuxの特定のタスク(システムコールの終了やコマンドの終了に送信されたときにプロセスIDを否定するなど)は、プロセスセッションで機能します。最も一般的な用途は、シェルを終了するときです。オペレーティングシステムは、シェルと同じセッションIDを持つすべてのプロセスkill -HUP -$$に(切断)シグナルを送信します。SIGHUPプロセスをキャンセルすると、そのプロセスのセッションIDがシェルで変更されるため、ハング信号に応答しません。これはデーモンになるプロセスの一部です。

ウィンドウマネージャ/グラフィック環境で呼び出されるほとんどのプロセスは、起動されたプログラムの1つと同じセッションIDを持ちます。これにより、オペレーティングシステムは、kill -HUP -$$ブラウザ、音楽プレーヤー、Libre Office、IMクライアントなどのすべてのプログラムに対して同じ操作を実行できます。これらのプロセスはセッションリーダーではありません。

答え3

私はこの質問に対する答えを知っていると思いましたが、それを解決するためにCプログラムを作成しました。

#include <stdio.h>
#include <unistd.h>

int
main(int ac, char **av)
{
        pid_t sid, mypid, pgid, gid;

        mypid = getpid();
        sid = getsid(0);
        pgid = getpgid(0);
        gid = getpgrp();

        printf("PID %d\n", mypid);
        printf("process group ID of session leader: %d\n", sid);
        printf("process group ID: %d\n", pgid);
        printf("process group ID: %d\n", gid);

        if (!fork())
        {
                mypid = getpid();
                sid = getsid(0);
                pgid = getpgid(0);
                gid = getpgrp();

                printf("child PID %d\n", mypid);
                printf("process group ID of session leader: %d\n", sid);
                printf("process group ID: %d\n", pgid);
                printf("process group ID: %d\n", gid);

                _exit(0);
        }

        return 0;
}

私はcc -g -o sid sid.c 何が起こるかを確認するためにいくつかの異なる方法でコンパイルしました。

./sid
nohup ./sid > sid.out
setsid ./sid

Linux(2.6.39)から返された結果に少し驚きました。また、マニュアルページのセクション7「資格情報」も見つかりました。

私のアドバイスは、man 7 credentials(またはLinux以外の場合に対応する)プロセスグループとセッションに関するセクションを読んで、この問題を解決できることを確認することです。

関連情報