GNU/Linux >> Linux Esercitazione >  >> Linux

Perché Sigint non viene propagato al processo figlio quando viene inviato al processo padre?

Dato un processo di shell (ad es. sh ) e il relativo processo figlio (ad es. cat ), come posso simulare il comportamento di Ctrl +C utilizzando l'ID di processo della shell?

Questo è quello che ho provato:

Esecuzione di sh e poi cat :

[[email protected] ~]$ sh
sh-4.3$ cat
test
test

Invio di SIGINT a cat da un altro terminale:

[[email protected] ~]$ kill -SIGINT $PID_OF_CAT

cat ricevuto il segnale e terminato (come previsto).

L'invio del segnale al processo padre non sembra funzionare. Perché il segnale non viene propagato a cat quando viene inviato al processo padre sh ?

Questo non funziona:

[[email protected] ~]$ kill -SIGINT $PID_OF_SH

Risposta accettata:

Come CTRL +C funziona

La prima cosa è capire come CTRL +C funziona.

Quando premi CTRL +C , l'emulatore di terminale invia un carattere ETX (end-of-text / 0x03).
Il TTY è configurato in modo tale che quando riceve questo carattere, invia un SIGINT al gruppo di processi in primo piano del terminale. Questa configurazione può essere visualizzata eseguendo stty -a e guardando intr = ^C; .
La specifica POSIX dice che quando viene ricevuto INTR, dovrebbe inviare un SIGINT al gruppo di processi in primo piano di quel terminale.

Cos'è il gruppo di processi in primo piano?

Quindi, ora la domanda è:come si determina qual è il gruppo di processi in primo piano?
Il gruppo di processi in primo piano è semplicemente il gruppo di processi che riceverà tutti i segnali generati dalla tastiera (SIGTSTP, SIGINT, ecc.).

Il modo più semplice per determinare l'ID del gruppo di processi è utilizzare ps :

ps ax -O tpgid

La seconda colonna sarà l'ID del gruppo di processi.

Come faccio a inviare un segnale al gruppo di processi?

Ora che sappiamo qual è l'ID del gruppo di processi, dobbiamo simulare il comportamento POSIX dell'invio di un segnale all'intero gruppo.

Questo può essere fatto con kill inserendo un - davanti all'ID del gruppo.
Ad esempio, se l'ID del gruppo di processi è 1234, dovresti utilizzare:

kill -INT -1234

Simula CTRL +C utilizzando il numero del terminale.

Quindi quanto sopra spiega come simulare CTRL +C come processo manuale. Ma cosa succede se si conosce il numero TTY e si desidera simulare CTRL +C per quel terminale?

Diventa molto facile.

Correlati:Bash converte \xC3\x89 in É?

Assumiamo $tty è il terminale a cui vuoi rivolgerti (puoi ottenerlo eseguendo tty | sed 's#^/dev/##' nel terminale).

kill -INT -$(ps h -t $tty -o tpgid | uniq)

Questo invierà un SIGINT a qualunque sia il gruppo di processi in primo piano di $tty è.
 


Linux
  1. Perché Cd non è un programma?

  2. Nuovo processo genitore quando il processo genitore muore?

  3. Il processo figlio riceve il SIGINT del genitore

  4. Perché il processo figlio è ancora vivo dopo che il processo genitore è stato ucciso in Linux?

  5. Bash:perché lo script genitore non termina su SIGINT quando lo script figlio intercetta SIGINT?

Come avviare un processo nel proprio gruppo di processi?

Quando è utile setsid() o perché abbiamo bisogno di raggruppare i processi in Linux?

Come ottenere il processo figlio dal processo padre

Come uccidere un processo figlio python creato con subprocess.check_output() quando il genitore muore?

Perché non posso terminare questo processo su Linux?

Quando un processo esegue il fork, viene copiata la sua memoria virtuale o residente?