1.需要包含头文件 #include <sys/time.h>
2.获取定时器时间函数.
int getitimer(int which, struct itimerval *curr_value);//获取定时器时间
3.设置定时器时间.
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 --保存之前时间, 一般填 NULL 即可
struct itimerval
{
struct timeval it_interval; / 定时器周期间隔时间 /
struct timeval it_value; /定时器初始定时时间/
};
struct timeval
{
time_t tv_sec; / 秒时间 */
suseconds_t tv_usec; /微秒时间/
};
4. 只定时一次:只指定 it_value;
5.实现重复定时器:若同时指定 it_interval, 则时间到到达后会将 it_value 值重新初始化为 it_interval 设定的值;
6.定时器:关闭 it_interval、 it_value 都清空;
7.样例程序
#include <stdio.h>
#include <time.h>
#include <sys/time.h>
#include <unistd.h>
#include <signal.h>
struct timeval tv;
void sig_work(int sig)
{
gettimeofday(&tv,NULL);
printf("[%ld s:%ld us]定时时间到, 捕获到信号:%d\n",tv.tv_sec,tv.tv_usec,sig);
}
int main(int argc,char **argv)
{
signal(SIGALRM,sig_work);
struct itimerval new_value=
{
.it_interval=//重复定时时间
{
.tv_sec=4,
.tv_usec=0
},
.it_value=//初始定时时间
{
.tv_sec=1,
.tv_usec=0
}
};
gettimeofday(&tv,NULL);
printf("[%ld s:%ld us]开启定时器\n",tv.tv_sec,tv.tv_usec);
setitimer(ITIMER_REAL,&new_value,NULL);
while(1)
{
}
}