2012-10-05 58 views

回答

9

總之,他們都這樣做。

當設置管道時,shell會創建一個process group^C被內核的行規訓解釋爲用戶請求中斷當前在前臺運行的進程組。向進程組發送信號(如SIGINT)會自動將信號傳遞給組中的所有進程。

2

我喜歡實驗更好:

#!/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" 

鏈接它們,運行,打破他們

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

正如你所看到的,處決了中斷信號,這意味着他們都被殺死。此外,它們輸出的次序是隨機的,例如:

[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