这激起了我的好奇心:SIGHUP 的行为是否像以前一样?第一条线索来自 bash 手册页shopt
:
huponexit如果设置,bash 将在交互式登录 shell 退出时向所有作业发送 SIGHUP。
在 vanilla Ubuntu 12.04 安装中,即使对于交互式会话,huponexit 也默认为“关闭”。作为一名经验主义者,我希望看到它的实际应用:
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
void
hupped(int i)
{
fprintf(stderr, "received SIGHUP 0x%x\n", i);
exit(1);
}
int main(int argc,char * argv[])
{
fprintf(stderr, "registering SIGHUP handler for PID %d\n", getpid());
signal(SIGHUP, hupped);
sleep(3600*5);
return 0;
}
即使 stdin 和 stdout 绑定到 tty,它也不会在 shell 退出时收到信号,这与文档一致。正如预期的那样,该进程成为 init 的子进程,并且与 pty 的连接被关闭。
从它的默认值来看,SIGHUP 对于 bash 交互式会话来说并不被认为是“有趣的”。然而,一旦你依赖它,你就会找到一个反例,很可能是在最糟糕的时候。