1、系统为每个进程维护3个计时器:
1)真实计时器: 程序运行的实际时间
2)虚拟计时器:用户态消耗的时间
3)实用计时器:用户态和内核态消耗的时间之和
真实计时器 = 用户+内核+睡眠
2、为程序设定计时器
1)用指定的初始时间间隔(设定完到第一次触发)和重复间隔为进程设定好
计时器后,该计时器就会定时地向进程发送时钟信号。
2)三个计时器锁发送的时钟信号分别为:
SIGALRM - 真实计时器
SIGVTALRM - 虚拟计时器
SIGPROF - 实用计时器
3)获取/设置计时器
|#include <sys/time.h>
int getitimer (int which,
struct itimerval* curr_value);
获取计时器设置。成功返回0,失败返回-1
int setitimer (int which,
const struct itimerval* new_value,
struct itimerval* old_value);
设置计时器。成功返回0,失败返回-1
which :
ITIMER_REAL/ITIMER_VIRTUAL/ITIMER_PROF
struct itimerval{
struct timeval it_interval;//重复间隔(两个时钟信号的时间间隔),
//取0将使计时器在第一个信号后停止。
struct timeval it_value; //初始间隔(从调用setitimer到第一次
//发送时钟信号的时间间隔,取0将立即停止计时器。
};
struct timeval { 两个相加之和
long tv_sec; //秒数
long tv_usec; //微秒数
}
//实现毫秒级时钟
|#include <stdio.h>
|#include <signal.h>
|#include <unistd.h>
|#include <sys/time.h>
int g_hour = 0, g_min = 0, g_sec = 0, g_msec = 0;
void sigalrm(int signum){
printf("\r%02d:%02d:%02d:%03d",g_hour ,g_min ,g_sec ,g_msec );
if(++g_msec == 1000){
g_msec = 0;
if(++g_sec == 60){
g_sec = 0;
if(++g_min == 60){
g_min = 0;
if(++g_hour == 24)
g_hour= 0;
}
}
}
}
void sigint(int signum){
static int run = 1; //局部静态变量,只初始化一次,后面不会再做初始化。
struct itimerval it = {{0,1000},{0, 0}};
if(run)
setitimer(ITIMER_REAL, &it, NULL);
else{
print("\n");
g_hour = g_min = g_sec = g_msec =0;
it.it_value.tv_usec = 1; //设置初始间隔不为0
setitimer(ITIMER_REAL, &it, NULL);
}
run ^= 1;
}
int main(void){
setbuf(stdout, NULL); //关闭输出缓冲区,及时显示打印信息
if(signal(SIGALRM, sigalrm) == SIG_ERR){
perror(signal);
return -1;
}
if(signal(SIGINT, sigalrm) == SIG_ERR){
perror(signal);
return -1;
}
struct itimerval it = {{0,1000},{5,0}}; //重复间隔(秒,微秒),初始间隔
if(setitimer(ITIMER_REAL, &it, NULL) == -1){
perror("setitimer");
rturn -1;
}
for(;;)
pause(); //睡眠
return 0;
}
网友评论