sshd讓一個子進程創建一個新的會話。 這裏是pstree的輸出(部分):SIGHUP從哪裏來? (sshd讓一個孩子創建一個新的會話,殺死這個孩子並且會話中的所有進程都死掉)
sshd(1230) -- sshd(1234) -- bash
(...)
|- sshd(1235) -- bash -- a.out -- a.out
運行後 「殺-9 1235」,a.out的死亡(捕捉到的信號是SIGHUP)
爲什麼?
tks!
sshd讓一個子進程創建一個新的會話。 這裏是pstree的輸出(部分):SIGHUP從哪裏來? (sshd讓一個孩子創建一個新的會話,殺死這個孩子並且會話中的所有進程都死掉)
sshd(1230) -- sshd(1234) -- bash
(...)
|- sshd(1235) -- bash -- a.out -- a.out
運行後 「殺-9 1235」,a.out的死亡(捕捉到的信號是SIGHUP)
爲什麼?
tks!
ssh
(與終端仿真器,screen
,tmux
,script
,以及一些其他程序)使用一個稱爲「僞終端」(或「PTY」)的事情,這就像一個撥號調制解調器連接。我這樣描述它,因爲這是此行爲的歷史淵源:如果您由於某種原因丟失了調制解調器連接,tty(或pty)驅動程序檢測到載波丟失,並將SIGHUP
(「Hangup
」)發送到您的會話。這使程序能夠保存其狀態(例如,vi
/vim
將保存您修改但未保存以供恢復的任何文件)並乾淨地關閉。同樣,如果網絡連接由於某種原因而離開(有人因電源或網絡電纜而絆倒?...或sssh
由於某種奇怪原因轉儲了內核),pty會將SIGHUP
發送給您的會話,以便它有機會保存任何未保存的內容數據。
從技術上說,tty/pty驅動程序將信號發送給連接到終端的進程組中的每個進程(進程組也與shell作業控制相關,但這是它們的原始目的)。一些其它的終端的信號處理相同的方式,例如按Ctrl +Ç發送和SIGINT
Ctrl鍵+\發送SIGQUIT
(和Ctrl鍵 + Ž發送SIGTSTP
,和程序,不處理SIGTSTP
暫停自己發送SIGSTOP
;這個雙重信號允許vim
設置終端從編輯模式回到正常模式,並在許多終端仿真器交換到預編輯屏幕緩衝區)。
嗯,這似乎是有道理的。非常感謝! – fireworks2 2011-04-03 04:06:35