複製鏈接
請複製以下鏈接發送給好友

SIGALRM

鎖定
POSIX兼容的平台上,SIGALRM是在定時器終止時發送給進程信號
中文名
SIGALRM
外文名
SIGALRM
學    科
計算機科學
描    述
定時器信號

目錄

SIGALRM簡介

POSIX兼容的平台上,SIGALRM是在定時器終止時發送給進程信號
它們的符號常量頭文件signal.h中定義。
在不同的平台上,信號的編號可能發生變化,因此需要使用符號名稱。

SIGALRM語源

SIG是信號名的通用前綴
ALRM是alarm的縮寫,即定時器。

SIGALRM使用

計算機程序通常使用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舉例

編程利用SIGALRM信號實現秒定時器 [1] 
#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();
}
}
參考資料