4、alarm和 setitimer系統呼叫
系統呼叫alarm的功能是設定乙個定時器,當定時器計時到達時,將發出乙個訊號給程序。該呼叫的宣告格式如下:
unsigned int alarm(unsigned int seconds);
在使用該呼叫的程序中加入以下標頭檔案:
#include
系 統呼叫alarm安排核心為呼叫程序在指定的seconds秒後發出乙個sigalrm的訊號。如果指定的引數seconds為0,則不再傳送 sigalrm訊號。後一次設定將取消前一次的設定。該呼叫返回值為上次定時呼叫到傳送之間剩餘的時間,或者因為沒有前一次定時呼叫而返回0。
注意,在使用時,alarm只設定為傳送一次訊號,如果要多次傳送,就要多次使用alarm呼叫。
對於alarm,這裡不再舉例。現在的系統中很多程式不再使用alarm呼叫,而是使用setitimer呼叫來設定定時器,用getitimer來得到定時器的狀態,這兩個呼叫的宣告格式如下:
int getitimer(int which, struct itimerval *value);
int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue);
在使用這兩個呼叫的程序中加入以下標頭檔案:
#include
該系統呼叫給程序提供了三個定時器,它們各自有其獨有的計時域,當其中任何乙個到達,就傳送乙個相應的訊號給程序,並使得計時器重新開始。三個計時器由引數which指定,如下所示:
timer_real:按實際時間計時,計時到達將給程序傳送sigalrm訊號。
itimer_virtual:僅當程序執行時才進行計時。計時到達將傳送sigvtalrm訊號給程序。
itimer_prof:當程序執行時和系統為該程序執行動作時都計時。與itimer_vir-tual是一對,該定時器經常用來統計程序在使用者態和核心態花費的時間。計時到達將傳送sigprof訊號給程序。
定時器中的引數value用來指明定時器的時間,其結構如下:
struct itimerval ;
該結構中tim結構定義如下:
struct tim ;
在setitimer 呼叫中,引數ovalue如果不為空,則其中保留的是上次呼叫設定的值。定時器將it_value遞減到0時,產生乙個訊號,並將it_value的值設 定為it_interval的值,然後重新開始計時,如此往復。當it_value設定為0時,計時器停止,或者當它計時到期,而it_interval 為0時停止。呼叫成功時,返回0;錯誤時,返回-1,並設定相應的錯誤**errno:
efault:引數value或ovalue是無效的指標。
einval:引數which不是itimer_real、itimer_virt或itimer_prof中的乙個。
下面是關於setitimer呼叫的乙個簡單示範,在該例子中,每隔一秒發出乙個sigalrm,每隔0.5秒發出乙個sigvtalrm訊號:
#include
#include
#include
#include
int sec;
void sigroutine(int signo)
return;
}int main()
該例子的螢幕拷貝如下:
localhost:~$ ./timer_test
process id is 579
catch a signal – sigvtalrm
catch a signal – sigalrm
catch a signal – sigvtalrm
catch a signal – sigvtalrm
catch a signal – sigalrm
catch a signal –gvtalrm
Linux 訊號signal處理函式
alarm 設定訊號傳送鬧鐘 相關函式 signal,sleep 表頭檔案 include 定義函式 unsigned int alarm unsigned int seconds 函式說明 alarm 用來設定訊號sigalrm在經過引數seconds指定的秒數後傳送給目前的程序。如果引數seco...
Signal訊號處理
在goahead的linux模組main.c 檔案中,main函式中出現了以下三個語句 signal sigpipe,sig ign signal sigint,siginthandler signal sigterm,siginthandler 這三條語句與網路訊號有關。在這裡做咯記錄。1.訊號概...
linux 訊號 signal函式
include include include include include include include signal 函式有iso c定義,因為iso c 不涉及多執行緒 程序組以及終端i o等,所以它對訊號的定義非常含糊,以至於對於unix系統而言毫無作用。最好用sigactioan來代替...