MST
星途 面试题库

面试题:C语言中Linux定时器多时间单位切换及精度优化

在一个使用C语言开发的Linux项目中,需要实现一个定时器,该定时器能够在秒、毫秒、微秒这三种时间单位之间灵活切换,并且要尽可能保证定时器精度不受太大影响。请详细阐述实现该功能的设计思路,并给出关键代码片段。
18.7万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 选择合适的定时器机制:在Linux下,可以使用setitimer函数,它能够提供高精度的定时功能,且支持秒和微秒级别的定时。
  2. 时间单位切换:通过定义不同的结构体成员来分别存储秒、毫秒、微秒的定时值,并根据需要进行转换。毫秒到微秒的转换为1毫秒 = 1000微秒,秒到微秒的转换为1秒 = 1000000微秒。
  3. 精度保证:减少系统调用开销,合理设置定时器的更新频率,避免过多的上下文切换等影响精度的因素。

关键代码片段

#include <stdio.h>
#include <sys/time.h>
#include <signal.h>

// 定时器到期时的信号处理函数
void timer_handler(int signum) {
    printf("Timer expired\n");
}

// 设置定时器
void set_timer(int seconds, int milliseconds, int microseconds) {
    struct itimerval timer;
    // 计算总微秒数
    long total_microseconds = seconds * 1000000 + milliseconds * 1000 + microseconds;
    timer.it_value.tv_sec = total_microseconds / 1000000;
    timer.it_value.tv_usec = total_microseconds % 1000000;
    timer.it_interval.tv_sec = 0;
    timer.it_interval.tv_usec = 0;

    // 注册信号处理函数
    signal(SIGALRM, timer_handler);

    // 设置定时器
    setitimer(ITIMER_REAL, &timer, NULL);
}

你可以这样调用:

int main() {
    // 设置定时器为1秒300毫秒500微秒
    set_timer(1, 300, 500);

    // 防止程序退出
    while (1);

    return 0;
}