回答:
Linuxでは、すべてのプロセスには、次のようないくつかのIDが関連付けられています。
プロセスID(PID)
これは、プロセスを識別する任意の番号です。すべてのプロセスには一意のIDがありますが、プロセスが終了し、親プロセスが終了ステータスを取得した後、プロセスIDは解放されて新しいプロセスで再利用されます。
親プロセスID(PPID)
これは、問題のプロセスを開始したプロセスの単なるPIDです。
プロセスグループID(PGID)
これは、プロセスグループリーダーの単なるPIDです。PID == PGIDの場合、このプロセスはプロセスグループリーダーです。
セッションID(SID)
これは、セッションリーダーの単なるPIDです。PID == SIDの場合、このプロセスはセッションリーダーです。
セッションとプロセスグループは、多数の関連プロセスを1つの単位として扱う単なる方法です。プロセスグループのすべてのメンバーは常に同じセッションに属しますが、セッションは複数のプロセスグループを持つことができます。
通常、シェルはセッションリーダーになり、そのシェルによって実行されるすべてのパイプラインはプロセスグループになります。これは、シェルの終了時にシェルの子を簡単に殺すためです。(詳細についてはexit(3)を参照してください。)
リーダーではないセッションまたはプロセスグループのメンバーを表す特別な用語はないと思います。
セッションリーダーは、セッションID ==プロセスIDのプロセスです。これは不自然に聞こえますが、セッションIDは子プロセスに継承されます。UNIX / Linux内の一部の操作はプロセスセッションで動作します。たとえば、killシステムコールまたはコマンドに送信するときにプロセスIDを無効にします。これの最も一般的な使用法は、シェルからログアウトするときです。OSはを送信しますkill -HUP -$$
。これは、シェルと同じセッションIDを持つすべてのプロセスにSIGHUP(ハングアップ)シグナルを送信します。プロセスを否認すると、プロセスのセッションIDはシェルから変更されるため、ハングアップ信号に応答しません。これは、デーモンプロセスになるプロセスの一部です。
ウィンドウマネージャ/グラフィカル環境から呼び出されるプロセスのほとんどは、スタートアッププログラムの1つと同じセッションIDを持っています。これにより、kill -HUP -$$
ブラウザ、音楽プレーヤー、libreoffice、IMクライアントなど、OSがすべてのプログラムで同じ操作を実行できます。これらはセッションリーダーではないプロセスです。
私はこれに対する答えを知っていると思ったが、これを理解するために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のマニュアルページ「credentials」も見つけました。
私のアドバイスはman 7 credentials
(またはLinux以外の場合は同等の方法で)、プロセスグループとセッションに関するセクションを読んで、それを解決できるかどうかを確認することです。
./sid
ありnohup ./sid
、実行するsetsid ./sid
と、セッションID(SID)は真新しく、プロセスPIDと同じです... I ' nohupがフォークを妨げた(またはそうだった)理由は
ps xao pid,ppid,pgid,sid,comm
これらのIDを表示するために使用します。