Kill
終端仿真器如何在收到 SIGKILL 後殺死他們的孩子?
據我了解, SIGKILL 無法被抓住。這意味著一個程序在作業系統銷毀它之前沒有時間殺死它的孩子。這可以用一個 shell 腳本來展示。
#! /bin/bash trap : SIGTERM SIGINT SIGKILL # SIGKILL is pointless. mplayer video.avi
用 SIGKILL 殺死它會使 mplayer 執行。
$ kill -9 $pid
但是當使用終端仿真器(xterm,Terminal,…)時,它的孩子會被殺死。這怎麼可能?
$ mplayer
並殺死它:
$ kill -9 $terminal_pid
mplayer 隨船一起沉沒。終端仿真器是否以某種方式擷取了 SIGKILL 或者這裡有其他力量在起作用?
啟動的程序
xterm
將是控制終端的會話領導者。當終端離開時,該程序會自動接收一個 SIGHUP 信號(後跟一個 SIGCONT)。這是由核心以與您按下 CTRL-C 時程序接收 SIGINT 類似的方式發送的。
此外,shell 可能會在退出時向其某些子級發送 SIGHUP(請參閱
disown
在某些 shell 中禁用它)
您的問題自行回答,這是因為這些程序在終端模擬器下作為子程序執行。因此,您殺死了終端仿真器,並在此過程中殺死了所有子程序(因為子程序與控制終端仿真器在同一程序組下執行)。
例如,請參見以下內容:
csb@darwin[~]$ ps fauwx | grep -A6 "xfce4-terminal" | awk '{ for (i = 2; i <= 9; i++) $i="" ; print $0 }' csb 0:32 xfce4-terminal --geometry=271x65 --display :0.0 --role=Terminal-0x1340050-2606-1351620352 --show-menubar --show-borders --hide-toolbars --working-directory /home/csb --tab --working-directory /home/csb csb 0:00 \_ gnome-pty-helper csb 0:00 \_ bash csb 0:00 | \_ ssh [redacted] csb 0:00 \_ bash csb 0:00 \_ ps fauwx csb 0:00 \_ grep --color=auto -A6 xfce4-terminal csb 0:00 \_ awk { for (i = 2; i <= 9; i++) $i="" ; print $0 }
所有這些程序都在“xfce4-terminal”程序下執行,所以如果我終止該程序,那麼它將自動終止程序組中的所有子程序……例如,退出終端模擬器視窗會一定會殺死我的 SSH 連接。
shell等程序創建新的程序組,通常將相關的子程序放入一個組中。每個作業都是一個程序組。在核心之外,shell 通過使用 killpg 系統呼叫向作業的程序組發送信號來操縱作業,該系統呼叫將信號傳遞給程序組中的所有程序。