Linux系統 訊號

2021-08-26 15:20:59 字數 1791 閱讀 1412

訊號的基本概念

為了理解訊號,先從我們最熟悉的場景說起。

使用者輸入命令,在shell下啟動乙個前台程序。

使用者按下ctrl+c,這個鍵盤輸入產生乙個硬體中斷。

如果cpu當前正在執行這個程序的**,則該程序的使用者空間**暫停執行,cpu從使用者態切換到核心態處理硬體中斷。

中斷驅動程式將ctrl -c解釋成乙個sigint訊號,記在該程序的pcb中(也可以說傳送了乙個sigint訊號給該程序 ) 。

當某個時刻要從核心返回到該程序的使用者空間**繼續執行之前,首先處理pcb中記錄的訊號,發現有乙個sigint訊號待處理,而這個訊號的預設處理動作是終止程序,所以直接終止程序而不再返回它的使用者空間**執行。

注意:ctrl-c產生的訊號只能發給前台程序。乙個命令後面加個&可以放到後台執行,這樣shell不必等待程序結束就可以接受新的命令,啟動新的程序。

shell可以同時執行乙個前台程序和任意多個後台程序,只有前台程序才能接到像ctrl_c這種控制鍵產生的訊號。

前台程序在執行過程中使用者隨時可能按下ctrl-c而產生乙個訊號,也就是說該程序的使用者空間**執行到任何地方都有可能收到sigint訊號而終止,所以訊號相對於程序的控制流程來說是非同步3的。

kill -l:檢視系統定義的訊號列表。

產生訊號的方式:

(1)使用者在終端按下某些鍵時,終端驅動程式會傳送訊號給前台程序,如ctrl-c產生sigint訊號,ctrl-\產生sigquit訊號,ctrl-z產生sigtstp訊號(可使前台程序停止)

(2)硬體異常產生訊號,這些條件由硬體檢測到並通知核心,然後核心向當前程序傳送適當的訊號,

(3)乙個程序呼叫kill(2)函式可以傳送訊號給另乙個程序。可以用kill(1)命令傳送 訊號給某個程序,kill(1)命令也是呼叫kill(2)函式實現的,如果不明確指定訊號則傳送sigterm訊號,該訊號的預設處理動作是終止程序。當核心檢測到某種軟體條件發生時也可以通過訊號通知程序,例如鬧鐘超時產生sigalrm訊號,向讀端已關閉的管道寫資料時產生sigpipe訊號。如果不想按預設動作處理訊號,使用者程式可以呼叫sigaction(2)函式告訴核心如何處理某中訊號。

(4)軟條件產生。

訊號處理常見方式概覽:(1)忽略此訊號(2)執行該訊號的預設處理動作。

(3)提供乙個訊號處理函式,要求核心在處理該訊號時切換到使用者態執行這個處理函式,這種方式稱為捕捉乙個訊號。

產生訊號

(1)通過終端按鍵產生訊號

sigint的預設處理動作是終止程序,sigquit的預設處理動作是終止程序並且core dump。

core dump:當乙個程序要異常終止時,可以選擇把程序的使用者空間記憶體資料全部儲存到磁碟上,檔名通常是core,這叫做core dump.程序異常終止通常是因為有bug,比如非法記憶體訪問導致段錯誤,事後可以用偵錯程式檢查core檔案以查清錯誤原因,這叫做post-mortem debug(事後除錯)

乙個程序允許產生多大的core檔案取決於程序的resource limit(這個資訊儲存在pcb中)。預設是不允許產生core檔案的,因為core檔案中可能包含使用者密碼等敏感資訊,不安全。在開發除錯階段可以用ulimit命令改變這個限制,允許產生core檔案。首先用ulimit命令改變shell程序的resource limit,允許core檔案最大為1024k: ulimit -c 1024.

kill命令是呼叫kill函式實現的。kill函式可以給乙個指定的程序傳送指定的訊號。raise函式可以給當前程序傳送指定的訊號。

int raise(int signo)

這兩個程序都是成功返回0,錯誤返回-1。

#include

Linux訊號系統

本文主要介紹linux訊號系統和如何使用posix api來響應訊號。本文中的示例適用於linux系統和大部分posix相容系統。在下列情況下,我們的應用程序可能會收到系統訊號 如需了解所有系統訊號,參見signal 7 手冊。每個訊號都關聯乙個預設的行為,當程序沒有捕獲並處理訊號時,程序會按照預設...

Linux系統中的訊號

訊號 signal 是linux系統中用於程序之間相互通訊或操作的一種機制。訊號是乙個相當廣泛的課題 在這裡,我們僅僅 幾種最重要的訊號以及利用訊號控制程序的技術。訊號是乙個傳送到程序的特殊資訊。訊號機制是非同步的 當乙個程序接收到乙個訊號時,它會立刻處理這個訊號,而不會等待當前函式甚至當前一行 結...

Linux系統程式設計 訊號

0x00 訊號和中斷類似,中斷是硬體發出,而訊號由軟體發出。訊號常用於程序間通訊,乙個訊號常見的處理如下 1 設定對應訊號的訊號處理函式。2 當訊號來臨時,打斷正常執行的程式 本質上是在系統呼叫前檢查是否有訊號的到來 去執行訊號處理函式。3 訊號處理函式執行完,繼續執行原程式。0x01 我們先來看一...