头文件:
#include <sys/time.h>
int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value); //设置定时器
setitimer提供三种类型的定时器(即which的值):
1. ITIMER_REAL:以实际时间递减,每次到期时发送SIGALRM信号;
2. ITIMER_VIRTUAL:以进程在用户模式CPU消耗的时间递减,每次到期时发送SIGVTALRM信号;
3. ITIMER_PROF:以进程在用户模式执行时间和进程背后系统的执行时间,每次到期时发送SIGPROF信号。
struct timeval
{
long tv_sec; //秒
long tv_usec; //微秒
};
struct itimerval
{
struct timeval it_interval; //后续定时器时间间隔
struct timeval it_value; //当前定时间多久后开始执行
};
从结构体可以看出,定时器精度可达微秒
实例:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <time.h>
#include <sys/time.h>
//同一个函数接收不同类型的信号
void sigroutine(int signo)
{
switch(signo)
{
case SIGALRM:
printf("Catch a signal -- SIGALRM\n");
break;
case SIGVTALRM:
printf("Catch a signal -- SIGVTALRM\n");
break;
case SIGPROF:
printf("Catch a signal -- SIGPROF\n");
break;
default:
printf("get signal %d\n", signo);
break;
}
return;
}
int main()
{
struct itimerval value, ovalue, value2, value3;
printf("process id is %d \n", getpid());
//设置函数可以接收的信号类型
signal(SIGALRM, sigroutine);
signal(SIGVTALRM, sigroutine);
signal(SIGPROF, sigroutine);
value.it_value.tv_sec = 4; //表示程序开始后,等待4秒开始发送信号
value.it_value.tv_usec = 0;
value.it_interval.tv_sec = 2; //时间间隔,第一次发送信号后,每隔2秒发送一次信号
value.it_interval.tv_usec = 0;
setitimer(ITIMER_REAL, &value, &ovalue);
value2.it_value.tv_sec = 5; //程序开始后,等待5秒开始发送信号
value2.it_value.tv_usec = 500000;
value2.it_interval.tv_sec = 2; //时间间隔,第一次发送信号后,每隔2秒发送一次信号
value2.it_interval.tv_usec = 0;
setitimer(ITIMER_VIRTUAL, &value2, &ovalue);
value3.it_value.tv_sec = 1; //程序开始后,等待1秒开始发送信号
value3.it_value.tv_usec = 0;
value3.it_interval.tv_sec = 2; //时间间隔,第一次发送信号后,每隔2秒发送一次信号
value3.it_interval.tv_usec = 500000;
setitimer(ITIMER_PROF, &value3, &ovalue);
while(1); //防止程序提前结束,不加则程序还没有响应定时器就直接退出
return 0;
}