Linux訊號程式設計實踐(一)

2021-12-29 20:28:59 字數 2718 閱讀 9437

中斷是系統對於非同步事件的響應, 程序執行**的過程中可以隨時被打斷,然後去執行異常處理程式;

計算機系統的中斷場景:中斷源發出中斷訊號 -> cpu判斷中斷是否遮蔽以及保護現場 -> cpu(查詢中斷向量表, 找到中斷服務程式的入口位址)執行中斷處理程式 ->(處理完中斷之後) ->恢復現場,繼續執行原來的任務

中斷分類

硬體中斷(外部中斷)

外部中斷是指由外部裝置通過硬體請求的方式產生的中斷,也稱為硬體中斷

軟體中斷(內部中斷)

內部中斷是由cpu執行程式錯誤或執行內部程式呼叫引起的一種中斷,也稱為軟體中斷(如:執行除0操作, 由使用者空間陷入核心空間等)。

訊號是unix/linux系統響應某些狀況而產生的事件,程序在接收到訊號時會採取相應的行動。訊號一般是因為某些錯誤條件而產生的,比如記憶體段衝突、浮點處理器錯誤或者非法指令等;訊號是在軟體層次上對中斷的一種模擬,所以通常把它稱為是軟中斷;

訊號與中斷的相似點:

(1)採用了相同的非同步通訊方式;

(2)當檢測出有訊號或中斷請求時,都暫停正在執行的程式而轉去執行相應的處理程式;

(3)都在處理完畢後返回到原來的斷點;

(4)對訊號或中斷都可進行遮蔽。

訊號與中斷的區別:

(1)中斷有優先順序,而訊號沒有優先順序,所有的訊號都是平等的;

(2)訊號處理程式是在使用者態下執行的,而中斷處理程式是在核心態下執行;

(3)中斷響應是及時的,而訊號響應通常都有較大的時間延遲。

linux常用訊號及其鍵值:

01 sighup 掛起(hangup)

02 sigint 中斷,當使用者從鍵盤按^c鍵或^break鍵時

03 sigquit 退出,當使用者從鍵盤按quit鍵時

04 sigill 非法指令

05 sigtrap 跟蹤陷阱(trace trap),啟動程序,跟蹤**的執行

06 sigiot iot指令

07 sigemt emt指令

08 sigfpe 浮點運算溢位

09 sigkill 殺死、終止程序

10 sigbus 匯流排錯誤

11 sigse** 段違例(segmentation violation),程序試圖去訪問其虛位址空間以外的位置

12 sigsys 系統呼叫中引數錯,如系統呼叫號非法

13 sigpipe 向某個非讀管道中寫入資料

14 sigalrm 鬧鐘。當某程序希望在某時間後接收訊號時發此訊號

15 sigterm 軟體終止(software termination)

16 sigusr1 使用者自定義訊號1

17 sigusr2 使用者自定義訊號2

18 sigcld 某個子程序死

19 sigpwr 電源故障

更加詳細的請參考

程序對訊號的響應可以分為一下幾種情況:

(1)忽略訊號

不採取任何操作、有兩個訊號不能被忽略:sigkill和sigstop。

[為什麼程序不能忽略sigkill/sigstop訊號。(如果應用程式可以忽略這2個訊號,系統管理無法殺死、暫停程序,無法對系統進行管理。)]

(2)捕獲並處理訊號

核心中斷正在執行的**,轉去執行先前註冊過的處理程式。

(3)執行預設操作

預設操作通常是終止程序,這取決於被傳送的訊號。

訊號的預設操作:通過 man 7 signal 檢視

引數signal是乙個帶signum和handler兩個引數的函式,準備捕捉或遮蔽的訊號由引數signum給出,接收到指定訊號時將要呼叫的函式由handler給出handler這個函式必須有乙個int型別的引數(即接收到的訊號**),它本身的型別是void, handler也可以是下面兩個特殊值:

sig_ign遮蔽該訊號

sig_dfl恢復預設行為

並且返回的是上一次的訊號處理函式,第一次的話則返回的是預設的處理函式。

我們分析一下以上程式的結果:我們先樹勇signal註冊了乙個sigint訊號,每次使用ctrl+c時發出訊號,執行handler函式,注意handler一定要有乙個int形參。輸入回車跳出while迴圈,再次輸入ctrl+c時,這時候的handler是oldhandler(預設)所以會退出。

Linux程式設計 訊號

訊號 就是軟體中斷。訊號提供了一種處理非同步事件的方法 終端使用者鍵入中斷鍵,則會通過訊號機構停止乙個程式。所以,訊號可以說是程序控制的一部分。訊號的名字都以三個字母開頭 sig 訊號是非同步事件的經典例項。l 當使用者按某些終端鍵時,產生訊號。l 硬體異常產生訊號 除數為0 無效的儲存訪問等等。l...

Linux程式設計 程序 訊號

半年不接觸linux,有些東西變的太陌生了,再回顧一下我的linux 基礎 程式設計吧 程序 1.得到程序資訊的常用函式 include include pid t getpid void 程序id pid t getppid void 父程序id uid t getuid void 程序所有者的i...

Linux程式設計 11 訊號

1.1 特點 1.2 訊號的狀態 訊號優先順序高,程序先執行訊號.未決訊號 等待被處理 遞達 已被處理 1.3 處理方式 忽略,捕捉,預設 1.4 訊號的四要素 1.5 man文件檢視訊號 man 7 signal 1.6 阻塞訊號集,未決訊號集2.1 kill 傳送訊號給指定程序 原型int ki...