首页 文章

我退出时为什么我的守护程序不会终止?

提问于
浏览
1

我正在阅读Linux进程组和会话 . 从this site我看到:

当用户退出系统时,内核需要终止用户运行的所有进程...为了简化此任务,将进程组织为多组会话 . 会话的ID与通过setsid()系统调用创建会话的进程的pid相同 . 该过程称为该会话组的会话负责人 . 然后,所有该进程的后代都是该会话的成员,除非他们专门从中删除它们 . setsid()函数不接受任何参数并返回新的会话ID .

这篇文章没有't say is when the OS decides to terminate a user'届会 . 我最初的假设是,当有人登录TTY时,TTY是会话负责人,并且该会话中调用的所有进程都属于它,除非他们调用 setsid() . 然而,正如最简单的例子所证实的那样,这显然是错误的 . 考虑一下这个"daemon" ...(我知道它不是一个真正的守护进程,但它会分叉)...

#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() 的调用,并且正如预期的那样,该过程在我注销时终止 . 任何人都可以解释为什么在我退出时fork导致应用程序不退出?

1 回答

  • 1

    当您在父级退出时进行分叉时,您将创建一个孤立进程(http://en.wikipedia.org/wiki/Orphan_process) . 这些孤儿重新成为初始化过程的父级 . 我会根据您的观察假设重新父母修改会话的ID .

    测试这个假设的直接方法是让父母等待孩子(对不起,我现在不在我的linux盒子上,而且不能这样做) .

相关问题