Linux 程序通訊 訊號的使用

2021-07-26 15:03:15 字數 1726 閱讀 9898

訊號概念

訊號(signal)是linux程序間通訊的一種機制,全稱為軟中斷訊號,也被稱為軟中斷。訊號本質上是在軟體層次上

對硬體中斷機制的一種模擬。

訊號由核心管理

產生的方式:

可以由核心自身產生,比如出現

硬體錯誤、記憶體讀取錯誤,分母為0的除法等,核心需要通知相應程序。

也可以由其他程序產生並傳送給核心,再由核心傳遞給目標程序。

什麼訊號不能捕捉也不能忽略?

sigkill(終止程序) sigstop (暫停程序)

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

傳送訊號

$ kill -signal pid

$ kill -9 1001 // 強制殺死1001程序

訊號處理機制

可以用函式signal註冊乙個訊號捕捉函式

#include

typedefvoid(*sighandler_t)(int);

//函式指標

sighandler_t

signal(intsignum,sighandler_thandler);

signal 呼叫成功,返回處理函式的位址,否則返回sig_err

#include

#include

#include

void ouch(int sig)

int main()

return

0;}

程序的四種狀態 rstz t:暫停

sigaction訊號處理機制

3.1 訊號情況處理分析

註冊訊號處理函式

當註冊訊號函式正在處理時,來了同類訊號排隊執行

當註冊訊號函式正在處理時,捕捉到其他類訊號,打斷然後先執行其他類訊號,

如果在發生訊號時,程式正阻塞在某個系統呼叫,例如呼叫

read()函式,則在處理完畢訊號後,接著從阻塞的系統返回。如

果不指定該引數,中斷處理完畢之後,read函式讀取失敗。

#include

int sigaction(int sig,const struct sigaction *act,struct sigaction *oact);

這個函式和signal 函式一樣,用於設定與sig關聯的動作。而oact不為空的話,它會儲存原來的signal的位置。act則用於設定指定訊號的動作。

#include

#include

#include

void ouch(int sig)

int main()

return

0;}

3.2.sigaction訊號處理註冊

函式原型:

#include

int sigaction(int signum,const struct siginfo_t *act ,struct sigaction *oldact)

struct sigaction;
sa_handler 和 sa_sigaction 只能乙個生效

Linux程序通訊 訊號通訊

訊號 signal 機制是unix系統中最為古老的程序間通訊機制,很多條件可以產生乙個訊號 1 當使用者按某些按鍵時,產生訊號 2 硬體異常產生訊號 除數為0 無效的儲存訪問等等。這些情況通常由硬體檢測到,將其通知核心,然後核心產生適當的訊號通知程序,例如 核心對正訪問乙個無效儲存區的程序產生乙個s...

Linux程序通訊 訊號

1.程序 在介紹訊號的概念之前,先簡單的介紹一下程序的概念 程序可以理解為一段正在執行的程式,它包括以下三個部分內容 1 一段正在執行的程式 2 與該段程式相關聯的全部資料 資料空間,記憶體,緩衝區 3 程式計數器 pc 2.訊號 可以這麼理解訊號,訊號本身不是訊息,它表達的內容才是訊息。linux...

Linux 程序通訊 訊號

linux 程序通訊 訊號 模擬 乙個程序收到訊號與乙個處理器收到乙個中斷請求可以說一樣的,訊號是非同步的,乙個程序不必通過任何操作來等待訊號的到達,事實上,程序也不知道訊號是什麼時候到達。常見訊號 sighup 從終端發出的訊號 sigint 來自鍵盤中斷訊號 sigkill 訊號結束接受訊號程序...