Linux setitimer函數(shù)的操作技巧
Linux系統(tǒng)使用setitimer函數(shù)能夠事項高精度的定時功能,用于定時執(zhí)行function,下面學(xué)習(xí)啦小編將針對setitimer函數(shù)的用法給大家做個詳細(xì)介紹,一起來了解下吧。
說明: setitimer一個進(jìn)程中只能有一個 下一個會覆蓋前一個的定時 想一個進(jìn)程多個定時器只能自己實現(xiàn)。
setitimer() 不支持在同一進(jìn)程中同時使用多次以支持多個定時器。
linux有關(guān)定時器(setitimer)的敘述是這樣的:
linux系統(tǒng)給每個進(jìn)程提供了3個定時器,每個定時器在各自不同的域里面計數(shù)。當(dāng)任何一個timer計數(shù)到結(jié)束了,系統(tǒng)就發(fā)送一個信號(signal)給該進(jìn)程,同時計數(shù)器重置。
一共支持以下3中計數(shù)器形式:
ITIMER_REAL 在real time中計數(shù)器減1,然后等計數(shù)往比后發(fā)送SIGALRM信號。
ITIMER_VIRTUAL 當(dāng)進(jìn)程在執(zhí)行的過程中計數(shù),然后當(dāng)計數(shù)完畢后發(fā)送SIGVTALRM信號給該進(jìn)程。
ITIMER_PROF 在該進(jìn)程被執(zhí)行和系統(tǒng)在代表該進(jìn)程執(zhí)行的時間都進(jìn)行計數(shù)
【getitimer/setitimer系統(tǒng)調(diào)用】
功能描述:
獲取或設(shè)定間歇計時器的值。系統(tǒng)為進(jìn)程提供三種類型的計時器,每一類以不同的時間域遞減其值。當(dāng)計時器超時,信號被發(fā)送到進(jìn)程,之后計時器重啟動。
用法:
#include 《sys/time.h》
int getitimer(int which, struct itimerval *value);
int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue);
參數(shù):
which:間歇計時器類型,有三種選擇
ITIMER_REAL //數(shù)值為0,計時器的值實時遞減,發(fā)送的信號是SIGALRM。
ITIMER_VIRTUAL //數(shù)值為1,進(jìn)程執(zhí)行時遞減計時器的值,發(fā)送的信號是SIGVTALRM。
ITIMER_PROF //數(shù)值為2,進(jìn)程和系統(tǒng)執(zhí)行時都遞減計時器的值,發(fā)送的信號是SIGPROF。
value,ovalue:時間參數(shù),原型如下
struct itimerval
{
struct timeval it_interval;
struct timeval it_value;
};
struct timeval
{
long tv_sec;
long tv_usec;
};
getitimer()用計時器的當(dāng)前值填寫value指向的結(jié)構(gòu)體。
setitimer()將value指向的結(jié)構(gòu)體設(shè)為計時器的當(dāng)前值,如果ovalue不是NULL,將返回計時器原有值。
返回說明:
成功執(zhí)行時,返回0。失敗返回-1,errno被設(shè)為以下的某個值
EFAULT:value或ovalue是不有效的指針
EINVAL:其值不是ITIMER_REAL,ITIMER_VIRTUAL 或 ITIMER_PROF之一
#include 《stdio.h》
#include 《unistd.h》
#include 《signal.h》
#include 《string.h》
#include 《sys/time.h》
#include 《errno.h》
void PrintMsg(int Num)
{
printf(“%s/n”, “Hello World”);
return;
}
int main(int argc, char* argv[])
{
signal(SIGALRM, PrintMsg);
struct itimerval tick;
tick.it_value.tv_sec = 10; //十秒鐘后將啟動定時器
tick.it_value.tv_usec = 0;
tick.it_interval.tv_sec =1; //定時器啟動后,每隔1秒將執(zhí)行相應(yīng)的函數(shù)
tick.it_interval.tv_usec = 0;
//setitimer將觸發(fā)SIGALRM信號
int ret = setitimer(ITIMER_REAL, &tick, NULL);
if ( ret != 0)
{
printf(“Set timer error. %s /n”, strerror(errno) );
return -1;
}
printf(“Wait!/n”);
getchar();
return 0;
}
上面就是Linux中setitimer函數(shù)的用法介紹了,setitimer函數(shù)擁有三種類型計時器選擇,為了達(dá)到更高精度的定時,還是選擇setitimer函數(shù)比較好。