Kill

終端仿真器如何在收到 SIGKILL 後殺死他們的孩子?

  • November 6, 2012

據我了解, 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 系統呼叫向作業的程序組發送信號來操縱作業,該系統呼叫將信號傳遞給程序組中的所有程序。

引用自:https://unix.stackexchange.com/questions/54963