面试题答案
一键面试1. 实现三层定时器嵌套
在Linux系统下,可使用setitimer
函数来实现定时器功能。
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/time.h>
// 任务函数声明
void task1();
void task2();
void task3();
// 信号处理函数
void sig_handler(int signum) {
switch (signum) {
case SIGALRM:
task1();
break;
default:
break;
}
}
void task1() {
printf("Task 1 executed.\n");
// 启动第二层定时器
struct itimerval new_value;
new_value.it_interval.tv_sec = 0;
new_value.it_interval.tv_usec = 100000;
new_value.it_value.tv_sec = 0;
new_value.it_value.tv_usec = 100000;
setitimer(ITIMER_REAL, &new_value, NULL);
signal(SIGALRM, task2);
}
void task2() {
printf("Task 2 executed.\n");
// 启动第三层定时器
struct itimerval new_value;
new_value.it_interval.tv_sec = 0;
new_value.it_interval.tv_usec = 200000;
new_value.it_value.tv_sec = 0;
new_value.it_value.tv_usec = 200000;
setitimer(ITIMER_REAL, &new_value, NULL);
signal(SIGALRM, task3);
}
void task3() {
printf("Task 3 executed.\n");
}
int main() {
// 初始化第一层定时器
struct itimerval value;
value.it_interval.tv_sec = 0;
value.it_interval.tv_usec = 50000;
value.it_value.tv_sec = 0;
value.it_value.tv_usec = 50000;
setitimer(ITIMER_REAL, &value, NULL);
signal(SIGALRM, sig_handler);
// 防止程序退出
while (1);
return 0;
}
2. 优化代码以减少系统资源消耗
- 减少不必要的系统调用:避免在定时器处理函数中频繁调用复杂的系统调用,例如文件I/O操作等。在上述代码中,任务函数
task1
、task2
、task3
尽量保持简单,只做必要的操作。 - 合理设置定时器精度:根据实际需求设置定时器的精度,不要设置过高的精度导致不必要的资源浪费。例如,若应用场景对时间精度要求不高,可适当增大
it_interval
和it_value
的时间间隔。
3. 提高定时器触发的准确性和效率
- 使用更精确的定时器:在Linux系统中,
ITIMER_REAL
是基于系统时钟的定时器,精度相对较高。若有更高精度需求,可考虑使用clock_nanosleep
等函数实现更精确的定时。 - 避免阻塞:确保定时器处理函数执行时间尽量短,避免阻塞其他任务。如果任务较复杂,可以考虑将其拆分成多个子任务,或使用多线程/多进程来处理,保证定时器能及时响应。
关键代码片段说明:
setitimer
函数用于设置定时器,ITIMER_REAL
表示基于系统实时时钟。it_interval
设置定时器的周期,it_value
设置定时器首次触发的时间。signal
函数用于注册信号处理函数,当定时器到期触发SIGALRM
信号时,相应的任务函数会被调用。