
第十章
信號
信號
(
signal
)就是軟體中斷所提供之用於處理非同步事件的一個種機制。這些事件可
能來自系統外部,例如用戶經由按下 Ctrl-C 產生中斷字符,或是來自程式或核心內部的
活動,例如行程執行到「除以零」(divide by zero)的程式碼。因為信號是行程間通訊
(interprocess communication,常簡寫為 IPC)的原始形式,一個行程還可以傳送信號
給另一個行程。
關鍵在於不只是事件發生的方式是非同步的—例如,程式執行期間,用戶可以在任何時
間點按下 Ctrl-C —而且程式處理信號的方式也是非同步的。當信號被遞送時,程式端會
以非同步的方式調用向核心註冊的信號處理函式。
早期的 Unix 就已經包含信號。然而,隨著時間的推移,它們已經有所演進,最值得注
意的是可靠性(因為信號有可能會遺失)以及功能性(因為信號現在可能會載送用戶定
義的資料)。起初,不同的 Unix 系統對信號做了不相容的更動。所幸,POSIX 將信號的
處理標準化,解決了此類問題。這個標準也就是 Linux 所提供的以及此處我們所要探討
的信號處理機制。
本章中,一開始我們會概述信號,以及探討信號的使用與誤用。接著會探討用於管理和
操作信號的各種 Linux 介面。
具實用價值的應用程式多半必須跟信號互動。就算你刻意把應用程式設計成進行通訊時
不需要用到信號—這通常是個好主意! —某些情況下你仍然不得不與信號為伍,例如當
程式收到終止信號的時候。