Linux系統程式設計 訊號

2021-10-11 19:03:59 字數 2572 閱讀 7124

訊號的共性

1.簡單

2.不能攜帶大量資訊

3.滿足特定條件才能傳送

訊號的機制

1.訊號是軟體層面的中斷。一旦訊號產生,無論程式執行到什麼位置都必須結束

2.所有訊號的產生以及處理都是核心產生.

訊號的產生

1.按鍵產生 程ctrl+c ,ctrl+v

2.系統呼叫產生 kill函式

3.定時器 alarm,setitimer

4.硬體異常產生 非法訪問記憶體

5.命令產生 如kill命令

訊號的未決與遞達

1.遞達:訊號產生遞送並到達程序,直接被核心處理了

2.未決: 產生和遞達中間,主要是由於阻塞導致了該狀態

可靠訊號與不可靠訊號

不可靠訊號:linux訊號機制基本上是從unix系統中繼承過來的。早期unix系統中的訊號機制比較簡單和原始,後來在實踐中暴露出一些問題,因此,把那些建立在早期機制上的訊號叫做"不可靠訊號"

可靠訊號:隨著時間的發展,實踐證明了有必要對訊號的原始機制加以改進和擴充。所以,後來出現的各種unix版本分別在這方面進行了研究,力圖實現"可靠訊號"。由於原來定義的訊號已有許多應用,不好再做改動,最終只好又新增加了一些訊號,並在一開始就把它們定義為可靠訊號,這些訊號支援排隊,不會丟失。可靠訊號一般都有預設的處理動作。

訊號的四要素

1.編號

2.名稱

3.事件

4.預設處理動作

訊號的處理方式

1.執行預設操作

2.忽略(丟棄)

3.捕捉(呼叫處理函式)

常用的訊號

sighup: 當使用者退出 shell 時,由該 shell 啟動的所有程序將收到這個訊號,預設動作為終止程序

sigint:當使用者按下了組合鍵時,使用者終端向正在執行中的由該終端啟動的程式發出此訊號。預設動

作為終止程序。

sigquit:當使用者按下組合鍵時產生該訊號,使用者終端向正在執行中的由該終端啟動的程式發出些信

號。預設動作為終止程序。

sigill: cpu 檢測到某程序執行了非法指令。預設動作為終止程序並產生 core 檔案

sigtrap:該訊號由斷點指令或其他 trap 指令產生。預設動作為終止里程 並產生 core 檔案。

sigabrt: 呼叫 abort 函式時產生該訊號。預設動作為終止程序並產生 core 檔案。

sigfpe:在發生致命的運算錯誤時發出。不僅包括浮點運算錯誤,還包括溢位及除數為 0 等所有的演算法錯誤。

預設動作為終止程序並產生 core 檔案。

sigkill:無條件終止程序。本訊號不能被忽略,處理和阻塞。預設動作為終止程序。它向系統管理員提供了

可以殺死任何程序的方法。

siguse1:使用者定義 的訊號。即程式設計師可以在程式中定義並使用該訊號。預設動作為終止程序。

sigse**:指示程序進行了無效記憶體訪問。預設動作為終止程序並產生 core 檔案。

sigusr2:另外乙個使用者自定義訊號,程式設計師可以在程式中定義並使用該訊號。預設動作為終止程序。

sigalrm: 定時器超時,超時的時間 由系統呼叫 alarm 設定。預設動作為終止程序。

sigterm:程式結束訊號,與 sigkill 不同的是,該訊號可以被阻塞和終止。通常用來要示程式正常退出。

執行 shell 命令 kill 時,預設產生這個訊號。預設動作為終止程序。

sigstkflt: linux 早期版本出現的訊號,現仍保留向後相容。預設動作為終止程序。

sigchld:子程序狀態發生變化時,父程序會收到這個訊號。預設動作為忽略這個訊號。

sigcont:如果程序已停止,則使其繼續執行。預設動作為繼續/忽略。

sigstop:停止程序的執行。訊號不能被忽略,處理和阻塞。預設動作為暫停程序。

sigtstp:停止終端互動程序的執行。按下組合鍵時發出這個訊號。預設動作為暫停程序。

sigttin:後台程序讀終端控制台。預設動作為暫停程序。

sigttou: 該訊號類似於 sigttin,在後台程序要向終端輸出資料時發生。預設動作為暫停程序。

sigurg:套接字上有緊急資料時,向當前正在執行的程序發出些訊號,報告有緊急資料到達。如網路帶外

資料到達,預設動作為忽略該訊號。

sigxcpu:程序執行時間超過了分配給該程序的 cpu 時間 ,系統產生該訊號並傳送給該程序。預設動作為

終止程序。

sigxfsz:超過檔案的最大長度設定。預設動作為終止程序。

si**talrm:虛擬時鐘超時時產生該訊號。類似於 sigalrm,但是該訊號只計算該程序占用 cpu 的使用時

間。預設動作為終止程序。

sgiprof:類似於 si**talrm,它不公包括該程序占用 cpu 時間還包括執行系統呼叫時間。預設動作為終止

程序。sigwinch:視窗變化大小時發出。預設動作為忽略該訊號。

sigio:此訊號向程序指示發出了乙個非同步 io 事件。預設動作為忽略。

sigpwr:關機。預設動作為終止程序。

sigsys:無效的系統呼叫。預設動作為終止程序並產生 core 檔案。

注意:9號訊號sigkill與19號訊號sigstop不可以被處理、忽略、或者阻塞。

Linux系統程式設計 訊號

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

Linux系統程式設計 訊號

基本概念 訊號的狀態 產生未決狀態 沒有被處理的 遞達 已經被處理的 訊號的優先順序比較高 程序收到訊號之後,暫停正在處理的工作 訊號集 kill 發射訊號給某個程序 raise 自己給自己發訊號 函式原型 int raise int sig abort 給自己傳送異常終止的訊號 alarm 設定定...

Linux系統程式設計 訊號

訊號處理雖然初學者用的不會很多,而且現有太多對訊號的替代品。但作為乙個打算專精發展的coder來說,還是必須學習和掌握的。linux下,乙個程序給其他程序傳送訊號的api是kill函式 include include intkill pid t pid,int sig sig 引數決定了要傳送的訊號...