信號是UNIX中所使用的進程通信的一種最古老的方法,是一種異步通信方式。信號可以直接進行用戶空間進程和內核進程之間的交互,內核進程也可以利用它來通知用戶空間進程發生了哪些系統事件。它可以在任何時候發給某一進程,而無需知道該進程的狀態。
一個完整的信號生命週期可以分爲如下階段
用戶進程對信號的響應可以有3種方式。
忽略信號,即對信號不做任何處理,但是有兩個信號不能忽略,即SIGKILL及SIGSTOP。
捕捉信號,定義信號處理函數,當信號發生時,執行相應的自定義處理函數。
執行缺省操作,Linux對每種信號都規定了默認操作,比如linux終端經常用ctrl+c終止某個進程
信號發送
kill()
kill()函數可以發送各種信號給進程或進程組,成功返回0
raise()
與kill()函數所不同的是,raise()函數允許進程向自身發送信號。
alarm()
alarm()也稱爲鬧鐘函數,它可以在進程中設置一個定時器,當定時器指定的時間到時,它就向進程發送SIGALARM信號。要注意的是,一個進程只能有一個鬧鐘時間,如果在調用alarm()之前已設置過鬧鐘時間,則任何以前的鬧鐘時間都被新值所代替。
pause()
pause()函數是用於將調用進程掛起直至捕捉到信號爲止。這個函數很常用,通常可以用於判斷信號是否已到。
注意:程序中有多少個pause(),就對應捕捉多少個信號
信號捕捉
信號處理的主要方法有兩種,一種是使用簡單的signal()函數,另一種是使用信號集函數組。 使用信號集函數組處理信號時涉及一系列的函數來創建信號集、註冊信號處理函數及檢測信號等,信號集函數組使用較少,就不研究了。
最後一個簡單的例子
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<signal.h>
void alarm_handler(int signum)
{
printf("I have been waken up by signal(%d).\n",signum);
}
int main()
{
int ret;
signal(SIGALRM,alarm_handler);
ret=alarm(3);
pause();
printf("The alarm return value is (%d).\n",ret);
return 0;
}