面试题答案
一键面试设计思路
- 选择合适的定时器机制:在Linux下,可以使用
setitimer
函数,它能够提供高精度的定时功能,且支持秒和微秒级别的定时。 - 时间单位切换:通过定义不同的结构体成员来分别存储秒、毫秒、微秒的定时值,并根据需要进行转换。毫秒到微秒的转换为1毫秒 = 1000微秒,秒到微秒的转换为1秒 = 1000000微秒。
- 精度保证:减少系统调用开销,合理设置定时器的更新频率,避免过多的上下文切换等影响精度的因素。
关键代码片段
#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;
}