我的理解是,为了阻止像这样的进程信号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。
编辑:有时在发帖之前应该多考虑一下。把它留在这里是为了提醒我我的耻辱:-(