
[英]who send sighup signal to childs when session leader exit, the c library or kernel?
[英]Who is the original sender of SIGHUP when the ssh connection is closed?
众所周知,当ssh连接断开时,bash将收到一个SIGHUP,并将此信号转发给它的所有子级。
我想知道谁是此SIGHUP的原始发件人,是ssh客户端,ssh服务器,操作系统还是其他?
我阅读了openssh-portabal的代码,发现仅在这里使用了SIGHUP: https : //github.com/openssh/openssh-portable/blob/master/sshconnect.c#L285
呼叫者似乎是客户端: https : //github.com/openssh/openssh-portable/blob/master/ssh.c#L1533
我在服务器端sshd.c中找不到任何发件人代码
这是否意味着发件人是客户端? 在这种情况下,如果连接中断,服务器将不会收到SIGHUP。 我对此不太确定,但根据我的经验,这似乎并不正确。
所以我很好奇谁应该是原始发件人。 有这个标准吗?
连接服务器端的bash进程正在运行,其控制端设置为伪终端对的从属端,而主端连接到sshd
进程。
连接终止后, sshd
进程将关闭伪终端的主端,这将导致内核伪终端驱动程序挂起伪终端的从属端。 当从属端挂断时,内核tty内核将SIGHUP
和SIGCONT
信号发送到终端的会话负责人(通常是bash
进程)以及会话负责人的进程组中的每个进程。
这不是伪终端和ssh特有的-如果您通过连接到串行端口的调制解调器拨入服务器,并且调制解调器挂起(这是“挂断” / SIGHUP
命名的起源),则会发生相同的情况)。 如您所知,这是历史悠久的行为。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.