linux下訊號程式設計簡介 不可靠的訊號

2021-04-17 16:49:29 字數 2330 閱讀 7703

訊號是什麼?其實這是乙個很有意思的東西。比如說汽車行駛在路上相互鳴笛這就是訊號;同樣遇到紅燈必須停下來這也是

訊號。對應到作業系統中,假設程序就是汽車,那麼程序之間可以傳送訊號;同樣如果假設作業系統是公路系統,那麼作業系統

也可以向程序傳送訊號。

在linux中訊號分為不可靠(或叫不安全)的訊號與可靠的訊號。後面我會解釋為什麼這麼說。

首先,簡單介紹一下linux系統中的通用訊號:

sighup   終端線以掛起。這是指當丟失載波訊號時數據機線的掛起操作。然而,當它用logout函式關閉時,也將適用於

任一終端裝置。

sigint   終端線已經收到中斷字元。

sigquit  終端線已經收到退出字元。

sigusr1  使用者定義訊號1。

sigusr2  使用者定義訊號2。

sigterm  正被終止的程序。

sigchld  乙個子程序已經終止。

sigpipe  半關閉管道發生寫操作。

sigalrm  alarm函式記時器到時。

再來看看要用的函式signal()。signal()函式的定義在標頭檔案 signal.h 中,它的函式原形是 sig_t signal(int sig,

sig_t func); 第乙個引數是想要註冊的訊號,第二個引數是指向訊號處理函式的指標,或缺省操作。系統提供了兩種預設操作:

sig_del 和 sig_ign,分別是預設訊號操作和忽略訊號。

好了說了一大堆枯燥無味的東西,有些暈了。單刀直入,看乙個程式把。還記得上次那個多程序的程式麼?我對其進行了一

些修改。使得當子程序執行結束後不必等父程序順序執行到 wait() 函式,而是直接轉入訊號處理函式。唉,複雜說不清楚。自

己看吧!

/*--------------------------signal_fork.c------------------------------*/

/* mikespook */

/* exercise function signal() */

/* 2002.7.18 */

#include

#include

#include

#include

#define fac_n 65535

/* 子程序呼叫的函式,這裡我為了模擬乙個很大的後台操作用了乙個迴圈。 */

void big_loop(int n);

/* 父程序呼叫的函式,其實不放到函式裡也可以,不過為了程式的結構更好看還是放到函式裡的好 */

void input_information();

/* 訊號處理函式,當父程序收到sigchld訊號的時候就會轉入該函式進行操作 */

void handler();

int main()

exit(0);  

} /*big_loop: 簡單,一看就明白,不解釋了。*/

void big_loop(int n)

putchar('/b');

} }

/*input_information: 簡單,一看就明白,也不解釋了。*/

void input_information()

printf("number1/tnumber2/tnumber3/tnumber4/n");

printf("%d/t%d/t%d/t%d/n", n_table[0], n_table[1], n_table[2], n_table[3]);

} /* 訊號處理函式,當子程序結束的時候會向父程序傳送 sigchld 訊號,這時程式會轉入這個函式裡進行處理 */

void handler()

/*--------------------------signal_fork.c------------------------------*/

看到了吧,訊號的使用還是很簡單的。但是這是不可靠的訊號使用方法。為什麼?道理很簡單,當你程式執行的時候收到一

個需要處理的訊號,你的程式就會轉入訊號處理函式,對訊號進行處理,處理完後再繼續執行後續程式。在這個過程中如果正好

是執行 malloc() 這樣的函式時收到了訊號,那麼當訊號處理完畢後因為 malloc() 不是乙個可重入的函式,程式不會繼續執行

malloc() ,這樣空間也許不會分配,而造成錯誤。所以我們還需要可靠的訊號處理方式,也就是說當執行某些不可被中斷的操作

的時候遮蔽掉訊號處理。直到這些關鍵操作完成,再對訊號進行處理。以後我會給大家詳細的解釋可靠訊號的操作。

引用:http://blog.csdn.net/zhoujunyi/archive/2007/04/13/1563180.aspx

10 4 不可靠訊號

在早期版本的unix系統中 比如說版本7 訊號是不可靠的,意思是說訊號可能丟失 乙個訊號出現,但是程序可能永遠也不知道它,aslo,a process had little conrol over a signal a process could catch the signal or ignore...

24 可靠訊號與不可靠訊號

以下整理 自 1 1 可靠訊號與不可靠訊號 1 訊號值小於 sigrtmin red hat 7.2 中,sigrtmin 32 sigrtmax 63 的訊號都是不可靠訊號。主要問題如下 程序每次處理訊號後,就將對訊號的響應設定為預設動作。在某些情況下,將導致對訊號的錯誤處理 因此,使用者如果不希...

學習筆記 可靠訊號 不可靠訊號

不可靠訊號pk可靠訊號 q linux訊號機制基本上是從unix系統中繼承過來的。早期unix系統中的訊號機制比較簡單和原始,後來在實踐中暴露出一些問題,它的主要問題是 q 程序每次處理訊號後,就將對訊號的響應設定為預設動作。在某些情況下,將導致對訊號的錯誤處理 因此,使用者如果不希望這樣的操作,那...