Linux Signal 訊號機制

2021-10-10 04:45:43 字數 2549 閱讀 7273

訊號捕捉實際操作流程

基礎概念:unix訊號利用程序間通訊向程序傳送訊號,可使接收程序受訊號影響(終止 掛機 繼續)

命令發出訊號:

kill - 訊號編號 程序id kill -9 1234

kill -l 檢視系統支援的訊號

其中 1 - 31 unix經典訊號 軟體開發工程師

34 - 64 實時訊號 驅動開發

32, 33 隱藏保留 給ntpl執行緒庫使用

函式產生訊號
kill(pid_t pid, int signo) //向任意程序傳送訊號

raise(int signo) //向調回函式傳送訊號

abort(void) //向呼叫程序傳送特定的sigabrt訊號

終端組合按鍵產生訊號 :作業系統中前台程序永遠只有乙個(可互動程式)

ctrl + c   核心向前臺程序傳送		sigint(2)

ctrl + \ 終止退出唯一前台程序 sigquit(3)

ctrl + z 掛起程序 sigtstp(20)

jobs 檢視作業

fg (frontground) + 作業id 將作業喚醒至前台繼續執行

bg (background) + 作業id 將作業喚醒至後台繼續執行

硬體異常產生訊號 :
段錯誤(segmentation fault) :  非法操作記憶體,核心向該程序傳送sige**(11),將其殺死

浮點數例外(floating point exception) : cpu違規運算(cpu / 0),核心向該程序傳送sigpe(8),將其殺死

匯流排錯誤 : 排程異常,控制異常,併發異常,核心向該程序傳送sigbus(7),將其殺死

軟條件產生訊號
定時器 : 使用alarm定時,定時到時後,核心向定時程序傳送sigalrm(14),通知其定時到時(殺死程序)

管道讀端關閉,寫端向管道寫資料,核心向寫端傳送sigpipe(13),殺死寫程序

sig_dfl預設行為

sig_ign忽略行為 : sigchld 該訊號預設的處理動作ign忽略(父子程序使用,子程序結束變為殭屍程序,核心向父程序傳送sigchld通知和父程序**)

sig_action捕捉行為

1.改變訊號行為 將預設行為改為忽略行為,可以使訊號失去原本的作用

2.改變訊號行為 將預設行為改為捕捉行為,可以使訊號失效

3.遮蔽/阻塞訊號 使訊號無法遞達,不會對程序造成影響(被遮蔽訊號沒有丟失,某一刻接觸遮蔽,依舊可以送達,影響程序)

阻塞訊號: 訊號未遞達

忽略訊號: 訊號已遞達,無處理動作

捕捉訊號: 訊號已遞達,有處理動作

siglkill(9) 只要發出必然殺死程序,無法遮蔽,捕捉和忽略

sigstop(19) 只要發出必然掛起,無法遮蔽,捕捉和忽略

1.定義初始化訊號行為結構體

struct sigaction act

act.sa_handler = 選擇訊號對應行為 sig_dfl sigign ,捕捉函式位址

void (*sa_handler)(int) 根據要求定義捕捉函式

act.sa_flags = 0 根據捕捉函式介面,調整flags選項,handler flags = 0

act.sa_mask 臨時遮蔽字,多個訊號繫結乙個捕捉函式,為了避免這個訊號同時觸發,捕捉函式呼叫產生功能異常,可以設定在處理當前訊號時,臨時遮蔽其他訊號

2.定義實現捕捉函式

3.將自定義訊號行為替換預設行為

sigaction(int signo, struct sigaction * new_act, struct sigaction * old_act);

無論是傳出遮蔽字或者訊號行為,都是為了某一刻還原程序狀態,如果不需要還原程序狀態則不需要傳出

訊號捕捉函式的執行過程:程序通常工作與使用者層,當訊號到達程序,抵達核心層,無法實時處理,只有程序切換到核心空間,才可以檢測到待處理訊號並進行處理

可以通過三種方式進行程序狀態切換:系統呼叫,中斷,異常 (cpu權級切換,使用者空間cpu許可權低限制大,核心空間許可權高可以訪問系統所有資源)

(核心執行捕捉函式 消耗程序資源)

訊號捕捉,可重入與不可重入:某個全域性任務,main先執行,產生訊號中斷處理訊號,捕捉函式也執行該任務,而且可以執行完,執行後回到main函式上次被中斷的位置繼續執行 (全域性任務 main先做 捕捉函式先做完)

不可重入函式: 函式內部使用了全劇資源(全域性或靜態),如果訊號捕捉函式與main函式同時呼叫不可重入函式,會導致衝突或異常

可重入函式: 函式內部沒有全域性資源,訊號捕捉技術可以放心使用

驅動 訊號機制

一 實驗平台 開發板fs2410,採用三星s3c2410的cpu,linux作業系統。二 實現功能 主程式讓四個led燈形成流水燈,當按下開關k1時,熄滅所有燈,並推出程序。三 實驗原理 阻塞和poll機制都是應用程式進行查詢,應用程式是主動的,而裝置時是被動的。訊號機制可以讓裝置主動向應用程式發訊...

Linux 信 號 機 制

前面介紹了訊號的基本概念,在這一節中,我們將介紹核心如何實現訊號機制。即核心如何向乙個程序傳送訊號 程序如何接收乙個訊號 程序怎樣控制自己對訊號的反應 核心在什麼時機處理和怎樣處理程序收到的訊號。還要介紹一下setjmp和longjmp在訊號中起到的作用。1 核心對訊號的基本處理方法 核心給乙個程序...

linux 訊號機制

本文旨在弄懂linux中的訊號工作原理 kill l 命令可以檢視linux下所有訊號 2.1 使用者在終端按下某些鍵時,終端驅動程式會傳送訊號給前台程序 例如ctrl c產生sigint訊號,ctrl 產生sigquit訊號,ctrl z產生sigtstp訊號 2.2 硬體異常產生訊號,這些條件由...