Linux程序間通訊 訊號

2022-09-12 18:51:14 字數 4444 閱讀 1326

訊號(signals)是unix、類unix以及其他posix相容的作業系統中程序間通訊的一種有限制的方式。它是一種非同步的通知機制,用來提醒程序乙個事件已經發生。當乙個訊號傳送給乙個程序,作業系統中斷了程序正常的控制流程,此時,任何非原子操作都將被中斷。如果程序定義了訊號的處理函式,那麼它將被執行,否則就執行預設的處理函式。

訊號是程序間通訊機制中唯一的非同步通訊機制,可以看作是非同步通知,通知接收訊號的程序有哪些事情發生了。也可以簡單理解為訊號是某種形式上的軟中斷。

可執行kill -l檢視linux支援的訊號列表:

sl@li:~/works$ kill -l

1) sighup 2) sigint 3) sigquit 4) sigill 5) sigtrap

6) sigabrt 7) sigbus 8) sigfpe 9) sigkill 10) sigusr1

11) sigse** 12) sigusr2 13) sigpipe 14) sigalrm 15) sigterm

16) sigstkflt 17) sigchld 18) sigcont 19) sigstop 20) sigtstp

21) sigttin 22) sigttou 23) sigurg 24) sigxcpu 25) sigxfsz

26) si**talrm 27) sigprof 28) sigwinch 29) sigio 30) sigpwr

31) sigsys 34) sigrtmin 35) sigrtmin+1 36) sigrtmin+2 37) sigrtmin+3

38) sigrtmin+4 39) sigrtmin+5 40) sigrtmin+6 41) sigrtmin+7 42) sigrtmin+8

43) sigrtmin+9 44) sigrtmin+10 45) sigrtmin+11 46) sigrtmin+12 47) sigrtmin+13

48) sigrtmin+14 49) sigrtmin+15 50) sigrtmax-14 51) sigrtmax-13 52) sigrtmax-12

53) sigrtmax-11 54) sigrtmax-10 55) sigrtmax-9 56) sigrtmax-8 57) sigrtmax-7

58) sigrtmax-6 59) sigrtmax-5 60) sigrtmax-4 61) sigrtmax-3 62) sigrtmax-2

63) sigrtmax-1 64) sigrtmax

可以看到linux中系統一共支援64種訊號,其中1到31號訊號為普通訊號(也程為不可靠訊號),34到64為實時訊號(可靠訊號)。

可靠訊號與不可靠訊號的區別:

以下列出幾個常用的訊號:

sighup

當使用者退出終端時,由該終端開啟的所有程序都退接收到這個訊號,預設動作為終止程序。

sigint

程式終止(interrupt)訊號, 在使用者鍵入intr字元(通常是ctrl+c)時發出,用於通知前台程序組終止程序。

sigquit

sigint類似, 但由quit字元(通常是ctrl+\)來控制. 程序在因收到sigquit退出時會產生core檔案, 在這個意義上類似於乙個程式錯誤訊號。

sigkill

用來立即結束程式的執行.本訊號不能被阻塞、處理和忽略

sigterm

程式結束(terminate)訊號, 與sigkill不同的是該訊號可以被阻塞和處理。通常用來要求程式自己正常退出。

sigstop

停止(stopped)程序的執行. 注意它和terminate以及interrupt的區別:該程序還未結束, 只是暫停執行.本訊號不能被阻塞, 處理或忽略.

要注意訊號處理函式的可重入問題,因為訊號處理函式執行過程中有可能被其他訊號再次中斷,這時程式會跳到另乙個訊號的處理函式中,處理完成後再次返回當前處理函式,編寫自己定義的訊號處理函式的時候一定要注意這一點。訊號可以理解為「軟中斷」,這樣可重入函式就很好理解了。

核心處理乙個程序收到的訊號的時機是在乙個程序從核心態返回使用者態時。 所以,當乙個程序在核心態下執行時,軟中斷訊號並不立即起作用,要等到將返回使用者態時才處理。程序只有處理完訊號才會返回使用者態,程序在使用者態下不會有未處理完的訊號。

核心處理乙個程序收到的軟中斷訊號是在該程序的上下文中,因此,程序必須處於執行狀態。當程序接收到乙個它忽略的訊號時,程序丟棄該訊號,就像沒有收到該訊號似的繼續執行。

如果程序收到乙個要捕捉的訊號,那麼程序從核心態返回使用者態時執行使用者定義的函式。而且執行使用者定義的函式的方法很巧妙,核心在使用者棧上建立乙個新的層,該層中將返回位址的值設定成使用者定義的處理函式的位址,這樣程序從核心返回彈出棧頂時就返回到使用者定義的函式處,從函式返回再彈出棧頂時,才返回原先進入核心的地方。 這樣做的原因是使用者定義的處理函式不能且不允許在核心態下執行(如果使用者定義的函式在核心態下執行的話,使用者就可以獲得任何許可權)。

下面引用乙個例子說明這個過程:

使用者程式註冊了sigquit訊號的處理函式sighandler

當前正在執行main函式,這時發生中斷或異常切換到核心態。

在中斷處理完畢後要返回使用者態的main函式之前檢查到有訊號sigquit遞達。

核心決定返回使用者態後不是恢復main函式的上下文繼續執行,而是執行sighandler函式,sighandlermain函式使用不同的堆疊空間,它們之間不存在呼叫和被呼叫的關係,是兩個獨立的控制流程。

sighandler函式返回後自動執行特殊的系統呼叫sigreturn再次進入核心態。

如果沒有新的訊號要遞達,這次再返回使用者態就是恢復main函式的上下文繼續執行了。

下面的**收到程式退出訊號後會執行使用者定義的訊號處理函式來替代系統預設的處理程式。

#include#include#include#include#includevoid sig_handle(int sig) 

int main ()

printf("main quit.");

return 0;

}

執行結果:

1

2received signal: 15, quit.

這段**功能與上面的例子差不多,訊號也可以傳參,但是更多的是通知功能,可傳遞的資訊非常有限,如果需要傳遞大量的資訊,可以考慮其他程序間通訊方式。

#include#include#include#include#includevoid new_op(int, siginfo_t*, void*);

int main()

struct sigaction act;

sigemptyset(&act.sa_mask); //sa_mask指定在訊號處理程式執行過程中,哪些訊號應當被阻塞。預設情況下當前訊號本身被阻塞,防止訊號的巢狀傳送

sigaddset(&act.sa_mask, sigterm);

sigaddset(&act.sa_mask, sigint);

act.sa_flags = sa_siginfo; //sa_siginfo,當設定了該標誌位時,表示訊號附帶的引數可以被傳遞到訊號處理函式中

act.sa_sigaction = new_op;

if (sigaction(sigint, &act, null) < 0)

if (sigaction(sigterm, &act, null) < 0)

if (sigaction(sighup, &act, null) < 0)

int i = 0;

while (1)

printf("end.");

return 0;

}void new_op(int signum, siginfo_t *info, void *myact)

printf("process quit.");

exit(0);

}

執行結果:

123

receive signal 15

signal processing: 0

signal processing: 1

signal processing: 2

signal processing: 3

signal processing: 4

process quit.

Linux 程序間通訊 訊號

訊號是在軟體層次上對中斷機制的一種模擬,在原理上,乙個程序收到乙個訊號與處理器收到乙個中斷請求可以說是一樣的。訊號是非同步的,乙個程序不必通過任何操作來等待訊號的到達,事實上,程序也不知道訊號到底什麼時候到達。訊號是程序間通訊機制中唯一的非同步通訊機制,可以看作是非同步通知,通知接收訊號的程序有哪些...

Linux程序間通訊 訊號

1.什麼是訊號 訊號是linux系統響應某些條件而產生的乙個事件,接收到該訊號的程序會執行相應的操作。2.訊號的產生 1 由硬體產生,如從鍵盤輸入ctrl c可以終止當前程序 2 由其他程序傳送,如可在shell程序下,使用命令 kill 訊號標號 pid,向指定程序傳送訊號。3 異常,程序異常時會...

linux程序間通訊 七 訊號通訊

在之前的博文 linux程序間通訊 一 初識篇 中,我們知道了程序間通訊主要分為三大類,分別是管道通訊,訊號通訊,以及ipc通訊 程序間通訊主要是為了不同程序之間的資料共享,訊號通訊也不例外。1 什麼是訊號通訊,或者說什麼是訊號機制?訊號是軟體層次上對中斷機制的一種模擬,是一種非同步通訊方式。通常如...