Linux 進程間通信 --信號
一、 信號是在軟件層次上對中斷機制的一種模擬,在原理上,一個進程收到一個信號與處理器收到一個中斷請求可以說是一樣的。信號是異步的,一個進程不必通過任何操作來等待信號的到達,事實上,進程也不知道信號到底什麽時候到達。
二、信號的種類 信號的名稱是在頭文件signal.h中定義的,信號都以SIG開頭 命令行輸入 kill -l 即可查看所有的信號三、進程對信號的響應
進程可以通過三種方式來響應一個信號:
(1)忽略信號,即對信號不做任何處理,其中,有兩個信號不能忽略:SIGKILL及SIGSTOP;
(2)捕捉信號。定義信號處理函數,當信號發生時,執行相應的處理函數;
(3)執行缺省操作,Linux對每種信號都規定了默認操作。註意,進程對實時信號的缺省反應是進程終止。
Linux究竟采用上述三種方式的哪一個來響應信號,取決於傳遞給相應API函數的參數。
四、信號的發送
發送信號的主要函數有:kill()、raise()、 sigqueue()、alarm()、setitimer()以及abort()。
kill (int pid ,int signl) 既可以向自身發送信號,也可以向別的進程發送信號
raise(int signl) 只能向進程本身發送信號。
alarm() 在指定的時間之後發送給自己 一個 SIGALRM的信號,如果不捕捉此信號,默認是終止該進程。
unsigned int alarm(unsigned int seconds); // 在多少秒之後
pause() 使進程掛起直至捕捉到一個信號。
五、信號的處理
sighandler_t signal(int signum, sighandler_t handler);
signal(SIGINT, my_func);
第一個參數指定信號的值,
第二個參數指定針對前面信號值的處理,可以忽略該信號(參數設為SIG_IGN)可以采用系統默認方式處理信號(參數設為SIG_DFL);也可以自己實現處理方式(參數指定一個函數地址)my_func()。
如果signal()調用成功,返回最後一次為安裝信號signum而調用signal()時的handler值;失敗則返回SIG_ERR。
#include <signal.h> #include <stdio.h> #include <stdlib.h> void my_func(int sign_no) { if(sign_no==SIGINT) printf("I have get SIGINT\n"); else if(sign_no==SIGQUIT) printf("I have get SIGQUIT\n"); } int main() { printf("Waiting for signal SIGINT or SIGQUIT \n "); /*註冊信號處理函數*/ signal(SIGINT, my_func); signal(SIGQUIT, my_func); pause(); exit(0); }
Linux 進程間通信 --信號