计时器

作者: 奥斯特洛司机 | 来源:发表于2019-03-28 15:21 被阅读0次

    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;
    }

    相关文章

      网友评论

        本文标题:计时器

        本文链接:https://www.haomeiwen.com/subject/kjbqbqtx.html