天天看點

3.5.linux中的信号

3.5.1.什麼是信号

3.5.1.1、信号是内容受限的一種異步通信機制

(1)信号的目的:用來通信

(2)信号是異步的(對比硬體中斷)

(3)信号本質上是int型數字編号(事先定義好的)

3.5.1.2、信号由誰發出

(1)使用者在終端按下按鍵

(2)硬體異常後由作業系統核心發出信号

(3)使用者使用kill指令向其他程序發出信号

(4)某種軟體條件滿足後也會發出信号,如alarm鬧鐘時間到會産生SIGALARM信号,向一個讀端已經關閉的管道write時會産生SIGPIPE信号

3.5.1.3、信号由誰處理、如何處理

(1)忽略信号

(2)捕獲信号(信号綁定了一個函數)

(3)預設處理(目前程序沒有明顯的管這個信号,預設:忽略或終止程序)

3.5.2.常見信号介紹

(1)SIGINT 2 Ctrl+C時OS送給前台程序組中每個程序

(2)SIGABRT 6 調用abort函數,程序異常終止

(3)SIGPOLL SIGIO 8 訓示一個異步IO事件,在進階IO中提及

(4)SIGKILL 9 殺死程序的終極辦法

(5)SIGSEGV 11 無效存儲通路時OS發出該信号

(6)SIGPIPE 13 涉及管道和socket

(7)SIGALARM 14 涉及alarm函數的實作

(8)SIGTERM 15 kill指令發送的OS預設終止信号

(9)SIGCHLD 17 子程序終止或停止時OS向其父程序發此信号

(10)

SIGUSR1 10 使用者自定義信号,作用和意義由應用自己定義

SIGUSR2 12

3.5.3.程序對信号的處理

3.5.3.1、signal函數介紹

3.5.3.2、用signal函數處理SIGINT信号

(1)預設處理

(2)忽略處理

細節:

(1)signal函數綁定一個捕獲函數後信号發生後會自動執行綁定的捕獲函數,并且把信号編号作為傳參傳給捕獲函數

(2)signal的傳回值在出錯時為SIG_ERR,綁定成功時傳回舊的捕獲函數

(3)

3.5.3.3、signal函數的優點和缺點

(1)優點:簡單好用,捕獲信号常用

(2)缺點:無法簡單直接得知之前設定的對信号的處理方法

3.5.3.4、sigaction函數介紹

(1)2個都是API,但是sigaction比signal更具有可移植性

(2)用法關鍵是2個sigaction指針

sigaction比signal好的一點:sigaction可以一次得到設定新捕獲函數和擷取舊的捕獲函數(其實還可以單獨設定新的捕獲或者單獨隻擷取舊的捕獲函數),而signal函數不能單獨擷取舊的捕獲函數而必須在設定新的捕獲函數的同時才擷取舊的捕獲函數。

3.5.4

3.5.4.1、alarm函數

(1)核心以API形式提供的鬧鐘

(2)程式設計實踐

核心隻為每個程序配置一個時鐘,一個鬧鐘沒結束,又定義一個鬧鐘,是不會定義成功,且會傳回上次定義後剩下的時間,

3.5.4.2、pause函數

(1)核心挂起

(2)代碼實踐

pause函數的作用就是讓目前程序沉睡運作,交出CPU給其他程序去執行。

當目前程序進入pause狀态後目前程序會表現為“卡住、阻塞住”,要退出pause狀态目前程序需要被信号喚醒。

3.5.4.3、使用alarm和pause來模拟sleep

繼續閱讀