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

fir*_*ks2 5 openssh sshd

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

sshd(1230) -- sshd(1234) -- bash
           (...)    
             |- sshd(1235) -- bash -- a.out -- a.out
Run Code Online (Sandbox Code Playgroud)

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

为什么?

TKS!

gee*_*aur 8

ssh(连同终端仿真器,screen,tmux,script,和其他一些程序)使用一个称为"伪终端"(或"PTY")的事情,这就像一个拨号调制解调器连接.我这样描述是因为这是这种行为的历史渊源:如果由于某种原因丢失了调制解调器连接,tty(或pty)驱动程序检测到载波丢失并发送SIGHUP(" Hangup")到您的会话.这使程序能够保存其状态(例如,vi/ vim将保存您已修改但未保存以进行恢复的所有文件)并完全关闭.同样,如果网络连接由于某种原因而消失(有人sssh因为某些奇怪的原因而被电源或网络电缆绊倒?...或转储核心),pty会发送SIGHUP到您的会话,以便它有机会保存任何未保存的数据.

从技术上讲,tty/pty驱动程序将信号发送到连接到终端的进程组中的每个进程(进程组也与shell作业控制有关,但这是他们最初的目的).一些其他终端信号以相同的方式处理,例如Ctrl+ C发送SIGINTCtrl+ \发送SIGQUIT(和Ctrl+ Z发送SIGTSTP,并且SIGTSTP通过挂起自身不处理的程序被发送SIGSTOP;该双重信号允许vim将终端从编辑模式设置回正常模式并且在许多终端仿真器中交换到预编辑屏幕缓冲区).