linux下定時器setitimer的使用
阿新 • • 發佈:2019-01-09
1,下面為setitimer函式引數:
int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue));
第一個引數int switch為設定定時器型別:
ITIMER_REAL : 以系統真實的時間來計算,它送出SIGALRM訊號。
ITIMER_VIRTUAL : -以該程序在使用者態下花費的時間來計算,它送出SIGVTALRM 訊號。
ITIMER_PROF : 以該程序在使用者態下和核心態下所費的時間來計算,它送出SIGPROF訊號。
第二個引數為設定定時器響應時間,兩個結構體。
1, struct itimerval {
struct timeval it_interval;
struct timeval it_value;
};
2、 struct timeval {
long tv_sec;
long tv_usec;
};
struct timeval it_value; 設定定時器初始響應時間,若只定義這個,則定時器只跑一次停止。
struct timeval it_interval;設定定時器每隔多久就響應得時間。
若想關閉定時器,則將兩個結構體資料都清零即可。
第三個引數可設定為空NULL。
2,一個簡單使用demo,用於定時器只進行一次響應。
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <string.h>
#include <sys/time.h>
static int count = 0;
#define SEC 1
#define USEC 0
void timeout(int signal)
{
printf("Get a SIGALRM, counts = %d!\n",count);
}
int on_timer()
{
struct itimerval tick;
memset(&tick, 0, sizeof(tick));
tick.it_value.tv_sec = SEC;
tick.it_value.tv_usec = USEC;
tick.it_interval.tv_sec = 0 ;
tick.it_interval.tv_usec = 0;
if(setitimer(ITIMER_REAL, &tick, NULL) < 0)
printf("Set timer failed!\n");
return 0;
}
int off_timer()
{
struct itimerval tick;
memset(&tick, 0, sizeof(tick));
tick.it_value.tv_sec = 0;
tick.it_value.tv_usec = 0;
tick.it_interval.tv_sec = 0;
tick.it_interval.tv_usec = 0;
if(setitimer(ITIMER_REAL, &tick, NULL) < 0)
printf("Set timer failed!\n");
return 0;
}
void *func(void *arg)
{
while(1)
{
printf("hello...\n");
count ++;
if(count%2 == 0)
{
on_timer();
sleep(2);
}
else
off_timer();
}
}
int main()
{
int res = 0;
signal(SIGALRM, timeout);
on_timer();
pthread_t fd;
pthread_create(&fd,NULL,func,NULL);
while(1)
{
sleep(20);
}
return 0;
}