在linux c編程中。setitimer是一個比較經常使用的函數。可用來實現延時和定時的功能,網上有各種零零散散的使用方法說明,都僅僅提到了個別使用方法,今天抽出時間實踐整理了一份比較具體的:
使用時須要引入的頭文件:
#include <sys/time.h>setitimer函數原型:
int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value);當中which參數表示類型。可選的值有:
ITIMER_REAL:以系統真實的時間來計算,它送出SIGALRM信號。
ITIMER_VIRTUAL:以該進程在用戶態下花費的時間來計算,它送出SIGVTALRM信號。
ITIMER_PROF:以該進程在用戶態下和內核態下所費的時間來計算。它送出SIGPROF信號。
緊接着的new_value和old_value均為itimerval結構體,先看一下itimerval結構體定義:
struct itimerval { struct timeval it_interval; /* next value */ struct timeval it_value; /* current value */ }; struct timeval { time_t tv_sec; /* seconds */ suseconds_t tv_usec; /* microseconds */ };itimeval又是由兩個timeval結構體組成,timeval包括tv_sec和tv_usec兩部分。當中tv_se為秒。tv_usec為微秒(即1/1000000秒)
當中的new_value參數用來對計時器進行設置,it_interval為計時間隔,it_value為延時時長,以下樣例中表示的是在setitimer方法調用成功后,延時1微秒便觸發一次SIGALRM信號,以后每隔200毫秒觸發一次SIGALRM信號。
settimer工作機制是,先對it_value倒計時,當it_value為零時觸發信號。然后重置為it_interval。繼續對it_value倒計時。一直這樣循環下去。
基於此機制。setitimer既能夠用來延時運行,也可定時運行。
假如it_value為0是不會觸發信號的,所以要能觸發信號,it_value得大於0;假設it_interval為零,僅僅會延時。不會定時(也就是說僅僅會觸發一次信號)。
old_value參數,通經常使用不上。設置為NULL,它是用來存儲上一次setitimer調用時設置的new_value值。
下面是一個簡單的使用樣例:
#include <stdio.h> #include <signal.h> #include <sys/time.h> void signalHandler(int signo) { switch (signo){ case SIGALRM: printf("Caught the SIGALRM signal!\n"); break; } } int main(int argc, char *argv[]) { signal(SIGALRM, signalHandler); struct itimerval new_value, old_value; new_value.it_value.tv_sec = 0; new_value.it_value.tv_usec = 1; new_value.it_interval.tv_sec = 0; new_value.it_interval.tv_usec = 200000; setitimer(ITIMER_REAL, &new_value, &old_value); for(;;); return 0; }
參考鏈接: