信號(一):Linux 中的信號

Linux 中的信號

在類 Unix 操作系統中,信號被用于進程間通信。信號是一個發送到某個進程或同一進程中的特定線程的異步通知,用于通知發生的一個事件。

對于在 Linux 環境進行編程的用戶或系統管理員來說,較好地理解信號的概念和機制是很重要的,在某些情況下可以幫助我們更高效地編寫程序。對于一個程序來說,如果每條指令都運行正常的話,它會連續地執行。但是如果在程序執行時,出現了一個錯誤或任何異常,內核就可以使用信號來通知相應的進程。信號同樣被用于通信、同步進程和簡化進程間通信,在 Linux 中,信號在處理異常和中斷方面,扮演了極其重要的角色。

信號已經在沒有任何較大修改的情況下被使用了將近 30 年。

當一個事件發生時,會產生一個信號,然后內核會將事件傳遞到接收的進程。有時,進程可以發送一個信號到其他進程。除了進程到進程的信號外,還有很多種情況,內核會產生一個信號,比如文件大小達到限額、一個 I/O 設備就緒或用戶發送了一個類似于 Ctrl+C 或 Ctrl+Z 的終端中斷等。

運行在用戶模式下的進程會接收信號。如果接收的進程正運行在內核模式,那么信號的執行只有在該進程返回到用戶模式時才會開始。

發送到非運行進程的信號一定是由內核保存,直到進程重新執行為止。休眠的進程可以是可中斷的,也可以是不可中斷的。如果一個在可中斷休眠狀態的進程(例如,等待終端輸入的進程)收到了一個信號,那么內核會喚醒這個進程來處理信號。如果一個在不可中斷休眠狀態的進程收到了一個信號,那么內核會拖延此信號,直到該事件完成為止。

當進程收到一個信號時,可能會發生以下 3 種情況:

  • 進程可能會忽略此信號。有些信號不能被忽略,而有些沒有默認行為的信號,默認會被忽略。
  • 進程可能會捕獲此信號,并執行一個被稱為信號處理器的特殊函數。
  • 進程可能會執行信號的默認行為。例如,信號 15(SIGTERM)的默認行為是結束進程。

當一個進程執行信號處理時,如果還有其他信號到達,那么新的信號會被阻斷直到處理器返回為止。

本文參考自 《Linux Shell命令行及腳本編程實例詳解

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容