一、getitimer
#include <sys/time.h>
int getitimer(int which, struct itimerval *curr_value);
**功能:**计时器的当前值填写在curr_value指向的结构体中
备注:
定时器由ITIMER_REAL、ITIMER_VIRTUAL或ITIMER_PROF之一指定
curr_value结构中的it_value字段被设置为计时器上剩余的时间量,如果计时器被禁用,则为零。类似地,it_interval被设置为重置值
参数:
which:间歇计时器类型,为上面介绍的3种定时器种类之一
curr_value:一个struct itimerval结构体类型,保存当前计时器的值
**返回值:**成功返回0;出错返回-1,并设置errno值,常见的错误值如下:
EFAULT:curr_value无效
EINVAL:which参数不是ITIMER_REAL, ITIMER_VIRTUAL,或ITIMER_PROF之一
二、setitimer函数
//头文件
#include <sys/time.h>
//函数原型
int setitimer(int which, const struct itimerval *new_value,
struct itimerval *old_value);
struct itimerval {
struct timeval it_interval; /*间隔,每隔多少时间,周期 */
struct timeval it_value; /* 第一次启动时间 */
};
struct timeval {
time_t tv_sec; /* seconds秒 */
suseconds_t tv_usec; /* microseconds微秒 */
};
如果it_value为0,那么计时器将不生效
如果计时器it_value过期之后,it_interval为0,那么计时器也将停止工作
ITIMER_REAL(值为0):计时器的值实时递减。计时器超时后,向进程发送SIGALRM信号
ITIMER_VIRTUAL(值为1):当进程在执行的过程中计数,仅在进程执行时递减。计时器超时后,发送SIGVTALRM信号
ITIMER_PROF(值为2):进程和系统执行时都递减计时器的值。这个计时器通常用于分析应用程序在用户和内核空间中花费的时间。计时器超时后,发送SIGPROF信号
将指定的计时器设置为new_value中的值。
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <time.h>
#include <sys/time.h>
#include <errno.h>
void sig_func(int signo);
int main()
{
//获取当前时间
time_t current_time;
(void)time(¤t_time);
//将时间转换为可读的时期和时间格式(struct tm)
struct tm*tm_ptr;
tm_ptr=gmtime(¤t_time);
printf("time:%02d:%02d:%2d,main start\n",tm_ptr->tm_hour,tm_ptr->tm_min,tm_ptr->tm_sec);
//为SIGALRM信号绑定处理函数
signal(SIGALRM,sig_func);
struct itimerval tick;
tick.it_value.tv_sec = 5; //计时器首次在5秒之后启动
tick.it_value.tv_usec = 0;
tick.it_interval.tv_sec =1; //定时器第一次到时之后,每隔1秒到期一次
tick.it_interval.tv_usec = 0;
//开启一个计时器,种类为ITIMER_REAL,触发的信号为SIGALRM
int ret = setitimer(ITIMER_REAL, &tick, NULL);
if ( ret != 0)
{
printf("setitimer error:%s \n", strerror(errno) );
exit(EXIT_FAILURE);
}
//pause函数:使进程/线程挂起,在接收到一个信号并从信号处理函数返回之后解除挂起操作
while(1)
pause();
exit(EXIT_SUCCESS);
}
void sig_func(int signo)
{
time_t current_time;
(void)time(¤t_time);
struct tm*tm_ptr;
tm_ptr=gmtime(¤t_time);
//打印时间和信号ID
printf("time:%02d:%02d:%2d,recv signal %d\n",tm_ptr->tm_hour,tm_ptr->tm_min,tm_ptr->tm_sec,signo);
}