Linux 訊號signal處理機制 四

2021-08-30 05:08:43 字數 1927 閱讀 2449

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來代替...