簡介
在不同的平台上,信號的編號可能發生變化,因此需要使用符號名稱。
語源
ALRM是alarm的縮寫,即定時器。
使用
電腦程式通常使用SIGALRM作為長時間操作的逾時信號,或提供一種隔一定時間間隔處理某些操作的方式。
SIGALRM通常在調用alarm(3)系統調用的整數秒之後產生。有時它被作為sleep(3)的實現;因此,不能保證可以用alarm(3)在sleep(3)調用進行中喚醒程式。
linux中的SIGALRM信號和SIGCHID信號
在進行阻塞式系統調用時,為避免進程陷入無限期的等待,可以為這些阻塞式系統調用設定定時器。Linux提供了alarm系統調用和SIGALRM信號實現這個功能。
要使用定時器,首先要安裝SIGALRM信號。如果不安裝SIGALRM信號,則進程收到SIGALRM信號後,預設的動作就是終止當前進程。SIGALRM信號安裝成功後,在什麼情況下進程會收到該信號呢?這就要依賴於Linux提供的定時器功能。在Linux系統下,每個進程都有惟一的一個定時器,該定時器提供了以秒為單位的定時功能。在定時器設定的逾時時間到達後,調用alarm的進程將收到SIGALRM信號。alarm系統調用的原型為:
#include <unistd.h>
unsigned int alarm(unsigned int seconds);
參數說明:
1)seconds:要設定的定時時間,以秒為單位。在alarm調用成功後開始計時,超過該時間將觸發SIGALRM信號。
返回值:
返回當前進程以前設定的定時器剩餘秒數。
舉例
編程利用SIGALRM信號實現秒定時器。
#include <stdio.h>
#include <signal.h>
//全局計數器變數
int Cnt=0;
//SIGALRM信號處理函式
void CbSigAlrm(int signo)
{
//輸出定時提示信息
printf(" seconds: %d",++Cnt);
printf("\r");
//重新啟動定時器,實現1秒定時
alarm(1);
}
void main()
{
//安裝SIGALRM信號
if(signal(SIGALRM,CbSigAlrm)==SIG_ERR)
{
perror("signal");
return;
}
//關閉標準輸出的行快取模式
setbuf(stdout,NULL);
//啟動定時器
alarm(1);
//進程進入無限循環,只能手動終止
while(1)
{
//暫停,等待信號
pause();
}
}