無聊之中,學習了一下setitimer函數的使用,整理一下,作個記錄。小程序
getitimer,setitimer - get or set value of an interval timer,man的第一句話是這樣寫的。其中的用法寫的很詳細了。網絡
函數原型: setitimer(int which,const struct itimerval *value,struct itimerval *ovalue)ide
<!---摘自網絡wordpress
ITIMER_REAL:減小實際時間.到時的時候發出SIGALRM信號。函數
ITIMER_VIRTUAL:減小有效時間(進程執行的時間).產生SIGVTALRM信號。學習
ITIMER_PROF:減小進程的有效時間和系統時間(爲進程調度用的時間)。這個常常和上面一個使用用來計算系統內核時間 和用戶時間.產生SIGPROF信號。ui
-------------->指針
itimerval.it_value.tv_sec,進程
itimerval.it_value.tv_usec,get
itimerval.it_interval.tv_sec,
itimerval.it_interval.tv_usec,
分別表示了第一次執行時間,單位s;第一次執行時間,單位ms;間隔時間,單位s,間隔時間,單位ms。
計時器是遞減的,時間到零後觸發signal。下邊的小程序運行5s後輸出第一個hello!!,之後每隔一秒輸出一次hello!!
供你們參考
timer.h
#ifndef TIMER_H
#define TIMER_H
struct itimerval tval;
void settimer(unsigned int,unsigned int,unsigned int,unsigned int);
void msg();
void quite();
#endif
timer.c
#include
#include
#include
#include
#include
#include "timer.h"
int main()
{
settimer(5,0,1,0);
signal(SIGALRM,msg);
signal(SIGINT,quite);
for(;;);
return 0;
}
void msg()
{
printf("hello world!!\n");
}
void quite()
{
printf("received interrupt[CTRL+C] signal,exit process!\n");
exit(0);
}
void settimer(unsigned int ue_sec,unsigned int ue_usec,unsigned int val_sec,unsigned int val_usec)
{
int res=0;;
memset(&tval,0,sizeof(tval));
tval.it_value.tv_sec=ue_sec;
tval.it_value.tv_usec=ue_usec;
tval.it_interval.tv_sec=val_sec;
tval.it_interval.tv_usec=val_usec;
tval=tval;
res=setitimer(ITIMER_REAL,&tval,NULL);
if(res)
{
printf("set timer failed!\n");
}
}