nohup 是如何工作的?

nohup 是如何工作的?

我的理解是,为了阻止像这样的进程信号SIGHUP,您需要从信号发送到的进程内执行此操作。然而,类似 Unix shellbash可以使用命令生成子进程并阻止HUP父进程中子进程的信号nohup。这是如何运作的?是否nohup阻塞信号然后执行子进程而不分叉?这是我能想到的唯一方法。

答案1

您可以看一下实现的源代码nohup例如GNU 的coreutils版本。有大量的设置,其中一些用于国际化目的,其余的用于处理各种重定向选项;然后实际的“nohupping”发生:

  signal (SIGHUP, SIG_IGN);

  char **cmd = argv + optind;
  execvp (*cmd, cmd);

正如您所猜测的,这会将进程设置为忽略 HUP 信号,然后exec执行请求的命令。

答案2

使用的行为nohup只是将生成的进程的 PPID 更改为 1 (init),以便当 shell 退出时,它不再是该 shell 的子进程,因此不会收到 HUP。

编辑:有时在发帖之前应该多考虑一下。把它留在这里是为了提醒我我的耻辱:-(

相关内容