1

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()、予想どおり、ログアウトするとプロセスが終了します。ログアウトしたときにフォークがアプリを終了しない理由を誰かが説明できますか?

4

1 に答える 1

1

親を終了させながらフォークすると、孤立したプロセスが作成されます(http://en.wikipedia.org/wiki/Orphan_process)。このような孤立は、 initプロセスの親になります。あなたが観察したことから、親の変更によってセッションのIDが変更されると思います。

この仮定をテストする簡単な方法は、親が子を待つことです(申し訳ありませんが、私は現在Linuxボックスを使用しておらず、実行できません)。

于 2013-03-05T21:34:57.797 に答える