(1)信號的概念
信號是進程在運行過程中,由自身產生或由進程外部發過來的消息(事件)。信號是硬件中斷的軟件模擬(軟中斷)。每個信號用一個整型常量宏表示,以SIG開頭,比如SIGCHLD、SIGINT等,它們在系統頭文件<signal.h>中定義,也可以通過在shell下鍵入kill –l查看信號列表,或者鍵入man 7 signal查看更詳細的說明。
信號的生成來自內核,讓內核生成信號的請求來自3個地方:
(1)用戶:用戶能夠通過輸入CTRL+c、Ctrl+\,或者是終端驅動程序分配給信號控制字符的其他任何鍵來請求內核產生信號;
(2)內核:當進程執行出錯時,內核會給進程發送一個信號,例如非法段存取(內存訪問違規)、浮點數溢出等;
(3)進程:一個進程可以通過系統調用kill給另一個進程發送信號,一個進程可以通過信號和另外一個進程進行通信。
進程接收到信號以後,可以有如下3種選擇進行處理:
(1)接收默認處理(SIG_DFT):接收默認處理的進程通常會導致進程本身消亡。例如連接到終端的進程,用戶按下CTRL+c,將導致內核向進程發送一個SIGINT的信號,進程如果不對該信號做特殊的處理,系統將採用默認的方式處理該信號,即終止進程的執行;
(2)忽略信號(SIG_IGN):進程可以通過代碼,顯示地忽略某個信號的處理,但是某些信號是不能被忽略的;
(3)捕捉信號並處理:進程可以事先註冊信號處理函數,當接收到信號時,由信號處理函數自動捕捉並且處理信號。
有兩個信號既不能被忽略也不能被捕捉,它們是SIG_KILL和SIG_STOP。即進程接收到這兩個信號後,只能接受系統的默認處理,即終止線程。
(2)signal函數
signal函數用於註冊一個信號捕捉函數。
- #include <signal.h>
- typedef void (*sighandler_t)(int);
- sighandler_t signal(int signum, sighandler_t handler);
signal的第1個參數signum表示要捕捉的信號,第2個參數是個函數指針,表示要對該信號進行捕捉的函數,該參數也可以是SIG_DEF(表示交由系統缺省處理,相當於白註冊了)或SIG_IGN(表示忽略掉該信號而不做任何處理)。signal如果調用成功,返回以前該信號的處理函數的地址,否則返回SIG_ERR。
sighandler_t是信號捕捉函數,由signal函數註冊,註冊以後,在整個進程運行過程中均有效,並且對不同的信號可以註冊同一個信號捕捉函數。該函數只有一個參數,表示信號值。
例:捕捉終端CTRL+c產生的SIGINT信號:
- #include <unistd.h>
- #include <stdio.h>
- #include <sys/wait.h>
- #include <sys/types.h>
- void SignHandler(int iSignNo)
- {
- printf("Capture sign no:%d\n",iSignNo);
- }
- int main()
- {
- signal(SIGINT,SignHandler);
- while(true)
- sleep(1);
- return 0;
- }
該程序運行起來以後,通過按 CTRL+c將不再終止程序的運行。應爲CTRL+c產生的SIGINT信號已經由進程中註冊的SignHandler函數捕捉了。該程序可以通過 Ctrl+\終止,因爲組合鍵Ctrl+\能夠產生SIGQUIT信號,而該信號的捕捉函數尚未在程序中註冊。
(3)定時機制
詳細參考:http://blog.csdn.net/allen_young_yang/article/details/6717755
http://blog.csdn.net/fanwenbo/article/details/2645362
如果定時時間到,那麼setitimer函數就會發出SIGALRM、SIGVTALRM、SIGPROF這三種信號;然後,我們可以通過signal函數將這三種信號註冊不同的函數功能,從而實現定時執行某個function.
http://my.oschina.net/zengsai/blog/11825
http://www.2cto.com/os/201207/142501.html