Linuxのプロセスグループとセッションについて読んでいます。このサイトから私は見る:
ユーザーがシステムからログアウトすると、カーネルはユーザーが実行していたすべてのプロセスを終了する必要があります...このタスクを簡素化するために、プロセスは一連のセッションに編成されます。セッションのIDは、setsid()システムコールを介してセッションを作成したプロセスのpidと同じです。そのプロセスは、そのセッショングループのセッションリーダーと呼ばれます。そのプロセスの子孫はすべて、特に自分自身をセッションから削除しない限り、そのセッションのメンバーになります。setsid()関数は引数を受け取らず、新しいセッションIDを返します。
この記事で述べられていないのは、OSがユーザーのセッションを終了することを決定したときです。私の最初の仮定は、誰かがTTYにログインすると、TTYがセッションリーダーであり、そのセッションで呼び出されるすべてのプロセスは、呼び出しない限りTTYに属するというものsetsid()
でした。ただし、最も単純な例で確認できるように、これは明らかに間違っています。この「デーモン」を考えてみてください...(実際のデーモンではないことはわかっていますが、フォークします)...
#include
#include
#include
#include
int main(void) {
pid_t pid = fork();
if(pid < 0) {
perror("fork");
exit(EXIT_FAILURE);
}
if(pid == 0) {
FILE * heartbeat_file = fopen("daemon.out", "w");
int hb = 0;
while(1) {
fprintf(heartbeat_file, "%d\n", hb);
fflush(heartbeat_file);
hb++;
sleep(1);
}
}
exit(EXIT_SUCCESS);
}
コードから、子が継続的にファイルに書き込み、親が終了することがわかります。私は決して電話をかけないことに注意してくださいsetsid()
。
ログインしてデーモンを実行し、次にログアウトしてからログインしても、デーモンはまだ実行されています。呼び出しを削除できますがfork()
、予想どおり、ログアウトするとプロセスが終了します。ログアウトしたときにフォークがアプリを終了しない理由を誰かが説明できますか?