2012-01-05 90 views
0

我想了解一些用於描述bash中的信號處理的示例代碼。在示例32-7的http://tldp.org/LDP/abs/html/debugging.html中,作者的評論指出他正在捕獲SIGINT,但陷阱是針對EXIT的。在後臺進程中捕獲SIGINT

 
{ 
    trap "exit" SIGUSR1 
    sleep $interval; sleep $interval 
    while true; do 
     ... 
    done; } &   # Start a progress bar as a background process. 

pid=$! 
trap "echo !; kill -USR1 $pid; wait $pid" EXIT  # To handle ^C. 

爲什麼EXIT的陷阱發送正確的信號(SIGUSR1)與化背景過程上的SIGINT(CTL-C)?

任何幫助表示讚賞解釋爲什麼這個工程。

回答

0

EXIT僞信號成爲上都正常退出而當腳本被中斷誤讀了這個問題。

+1

不,只有當進程調用exit(2)本身(或者因爲它到達腳本的結尾或者明確的「退出」指令)。 – fge 2012-01-05 08:56:56

+0

對,腳本應該有像'陷阱'出口127'2 15'來處理這個問題。 – tripleee 2012-01-05 12:06:04

+0

啊。得到它了。經過進一步測試後,我看到在鍵盤中斷時,執行了INT陷阱,然後發生了EXIT陷阱。 – user1131035 2012-01-09 19:24:17

1

EXIT是bash的trap的特殊處理程序,它不是一個信號。沒有退出信號。只要bash進程終止,該陷阱就會被執行。所以,確保如果用戶殺死bash進程,SIGUSR1會被髮送到後臺進程,後臺進程也會被捕獲,然後在該進程中執行「退出」。這確保瞭如果你終止會話,後臺進程不會永遠生活,但也會退出(這可能是評論試圖解釋的內容)。

編輯:我在原來的響應

+0

你也誤解了代碼。僞信號「EXIT」的陷阱顯然是在最後一行設置的。這會在Bash中創建一個退出處理程序。但代碼serms不完整。 – tripleee 2012-01-05 07:36:04

+0

......事實上,腳本會繼續執行一些長時間運行的命令(請參閱問題鏈接)。 – tripleee 2012-01-05 07:40:54

+0

@tripleee你是對的!我甚至沒有處理最後一行代碼!我將編輯我的回覆(上面的代碼已完成) – 2012-01-05 07:41:06