2012-10-05 19 views

Odpowiedz

9

Krótko mówiąc, wszyscy to robią.

Podczas konfiguracji potoku powłoka tworzy process group. ^C interpretowana jest przez dyscyplinę liniową jądra jako żądanie użytkownika do przerwania grupy procesów aktualnie uruchomionej na pierwszym planie. Wysyłanie sygnału, takiego jak SIGINT do grupy procesów, automatycznie dostarcza sygnał do wszystkich procesów w grupie.

2

Lubię eksperymenty lepiej:

#!/bin/bash 
# FILE /tmp/bla.sh 
# trap ctrl-c and call ctrl_c() 
trap ctrl_c INT 

MY_ID=$1 # Identifier for messages 

function ctrl_c() { 
    echo >&2 "GOODBYE $MY_ID" 
    exit 
} 

# This will continue until interrupted, e.g. if the input/output get closed 
cat 
# If we somehow got to the end 
echo >&2 "grace $MY_ID" 

je na łańcuchu, bieganie i ich łamanie

[email protected]:~$ /tmp/bla.sh 1 | /tmp/bla.sh 2 
^CGOODBYE 2 
GOODBYE 1 
0 

Jak widać, obie egzekucje dostał sygnał przerwania, czyli wszyscy giną. Co więcej, kolejność, w której wyprowadzane są dane, że zostały zabite, jest losowa, np .:

[email protected]:~$ /tmp/bla.sh 1 | /tmp/bla.sh 2 | /tmp/bla.sh 3 | /tmp/bla.sh 4 
^CGOODBYE 2 
GOODBYE 4 
GOODBYE 1 
GOODBYE 3