訊號是什麼?其實這是乙個很有意思的東西。比如說汽車行駛在路上相互鳴笛這就是訊號;同樣遇到紅燈必須停下來這也是
訊號。對應到作業系統中,假設程序就是汽車,那麼程序之間可以傳送訊號;同樣如果假設作業系統是公路系統,那麼作業系統
也可以向程序傳送訊號。
在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 程序每次處理訊號後,就將對訊號的響應設定為預設動作。在某些情況下,將導致對訊號的錯誤處理 因此,使用者如果不希望這樣的操作,那...