SIGHUP来自哪里? (sshd要求孩子创建一个新会话,杀死这个孩子,会话中的所有进程都会死掉)

时间:2011-04-03 03:36:26

标签: openssh sshd

sshd分叉子进程来创建新会话。 这是pstree的输出(部分):

sshd(1230) -- sshd(1234) -- bash
           (...)    
             |- sshd(1235) -- bash -- a.out -- a.out

运行“kill -9 1235”后,a.out死掉(捕获的信号为SIGHUP)

为什么?

TKS!

1 个答案:

答案 0 :(得分:7)

ssh(以及终端模拟器,screentmuxscript以及其他一些程序)使用称为“伪tty”的东西(或“ pty“),其行为类似于拨号调制解调器连接。我这样描述是因为这是这种行为的历史根源:如果由于某种原因丢失了调制解调器连接,tty(或pty)驱动程序检测到丢失了运营商并发送了SIGHUP(“Hangup “)到你的会议。这使程序能够保存其状态(例如,vi / vim将保存您已修改但未保存以进行恢复的所有文件)并完全关闭。同样,如果网络连接由于某种原因而消失(有人因为某些奇怪的原因而绊倒电源或网络电缆?...或sssh转储核心),pty会向您的会话发送SIGHUP,它有机会保存任何未保存的数据。

从技术上讲,tty / pty驱动程序将信号发送到连接到终端的进程组中的每个进程(进程组也与shell作业控制有关,但这是他们最初的目的)。其他一些终端信号的处理方式相同,例如 Ctrl + C 发送SIGINT Ctrl + \ < / kbd>发送SIGQUIT(和 Ctrl + Z 发送SIGTSTP,以及通过暂停自己来处理SIGTSTP的程序发送SIGSTOP;此双重信号允许vim将终端从编辑模式设置为正常模式,并在许多终端模拟器中交换到预编辑屏幕缓冲区。)