Come possono gli emulatori terminali uccidere i loro figli dopo aver ricevuto un SIGKILL?


12

Da quello che ho capito, SIGKILL non può essere catturato. Ciò implicherebbe che un processo non ha il tempo di uccidere i suoi figli prima che il sistema operativo lo distrugga. Questo può essere dimostrato con uno script di shell.

#! /bin/bash

trap : SIGTERM SIGINT SIGKILL # SIGKILL is pointless.

mplayer video.avi

Ucciderlo con SIGKILL lascia correre mplayer.

$ kill -9 $pid

Ma quando si usa un emulatore di terminale (xterm, Terminal, ...) i suoi bambini vengono uccisi insieme ad esso. Com'è possibile?

$ mplayer

E uccidilo:

$ kill -9 $terminal_pid

E mplayer scende con la nave. Gli emulatori di terminali stanno in qualche modo catturando SIGKILL o c'è un'altra forza all'opera qui?

Risposte:


11

Il processo avviato xtermsarà il leader della sessione nel controllo del terminale.

Quando il terminale scompare, quel processo riceve automaticamente un segnale SIGHUP (seguito da un SIGCONT). Questo viene inviato dal kernel in modo simile ai processi che ricevono SIGINT quando si preme CTRL-C.

Inoltre, una shell può inviare SIGHUP ad alcuni dei suoi figli all'uscita (vedere disownin alcune shell per disabilitarlo)


1
Per informazioni su sessioni e leader di sessione: unix.stackexchange.com/questions/18166/… .
Kevin Cox,

+1 per il disownquale è molto utile.
matematica

1

La tua domanda risponde da sola, questo accade perché questi processi sono in esecuzione come bambini sotto l'emulatore di terminale. Quindi uccidi l'emulatore di terminale e, nel farlo, uccidi tutti i processi figlio (poiché i bambini sono in esecuzione nello stesso gruppo di processi dell'emulatore terminale di controllo).

Vedere, ad esempio, quanto segue:

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 }

Tutti questi processi sono in esecuzione sotto i processi 'xfce4-terminal', quindi se uccido quel processo, ucciderebbe automaticamente tutti i processi figlio nel gruppo di processi ... allo stesso modo, ad esempio, uscendo dalla finestra dell'emulatore di terminale necessariamente uccidere la mia connessione SSH.

Programmi come le shell creano nuovi gruppi di processi, in genere inserendo i processi figlio correlati in un gruppo. Ogni lavoro è un gruppo di processi. Fuori dal kernel, una shell manipola un lavoro inviando segnali al gruppo di processi del lavoro con la chiamata di sistema killpg, che fornisce un segnale a tutti i processi in un gruppo di processi.


3
-1: uccidere un genitore non provoca la morte dei bambini.
Camh,

2
Programmi come le shell creano nuovi gruppi di processi, in genere inserendo i processi figlio correlati in un gruppo. Ogni lavoro è un gruppo di processi. Fuori dal kernel, una shell manipola un lavoro inviando segnali al gruppo di processi del lavoro con la chiamata di sistema killpg, che fornisce un segnale a tutti i processi in un gruppo di processi.
Charles Boyd,

2
@CharlesBoyd Quel commento dovrebbe essere parte della tua risposta.
Giordania,

4
@CharlesBoyd: aggiungilo alla tua risposta e ti darò +1 invece di -1. La tua risposta al momento si legge come se i processi secondari venissero interrotti quando un processo genitore viene ucciso (BTW, basato sulla sessione, non basato sul gruppo di processi).
Cam

@CharlesBoyd Lo capisco, ma il punto della domanda è come "manipola [] un lavoro inviando segnali" quando riceve un SIGKILL. Non vedo alcun modo per utilizzare la killpgchiamata di sistema a quel punto.
Kevin Cox,

0

In primo luogo, non riesco a riprodurre il mplayer sopravvissuto al terminale ucciso, usando xterm.

Il motivo per cui muore, è che ottiene un SIGHUP dalla morte dei suoi genitori.


Non l'ho mai detto, ho detto che muore ma sopravvive quando è in una sceneggiatura e questo viene ucciso.
Kevin Cox,

Non sopravvive in una sceneggiatura, per me.
tumbleweed,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.