Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

where is SIGHUP from? (sshd forks a child to create a new session, kill this child and all processes in the session dies)

Tags:

openssh

sshd

sshd forks a child process to create a new session. here is the output(partial) of pstree:

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

After running "kill -9 1235" , a.out dies (the signal captured is SIGHUP)

Why?

tks!

like image 649
fireworks2 Avatar asked Apr 03 '11 03:04

fireworks2


1 Answers

ssh (along with terminal emulators, screen, tmux, script, and some other programs) uses a thing called a "pseudo-tty" (or "pty"), which behaves like a dialup modem connection. I describe it that way because that's the historical origin of this behavior: if you lost your modem connection for some reason, the tty (or pty) driver detected the loss of carrier and sent SIGHUP ("Hangup") to your session. This enables programs to save their state (for example, vi/vim will save any files you had modified but not saved for recovery) and shut down cleanly. Similarly, if the network connection goes away for some reason (someone tripped over the power or network cable? ...or sssh dumped core for some odd reason), the pty sends SIGHUP to your session so it gets a chance to save any unsaved data.

Technically, the tty/pty driver sends the signal to every process in the process group attached to the terminal (process groups are also related to shell job control, but this was their original purpose). Some other terminal signals are handled the same way, for example Ctrl + C sends SIGINT and Ctrl + \ sends SIGQUIT (and Ctrl + Z sends SIGTSTP, and programs that don't handle SIGTSTP by suspending themselves are sent SIGSTOP; this double signal allows vim to set the terminal back from editing mode to normal mode and in many terminal emulators swap to the pre-editing screen buffer).

like image 164
geekosaur Avatar answered Oct 28 '22 22:10

geekosaur