面试题答案
一键面试使用 setitimer
实现定时器及取消定时任务
在Linux系统下,我们可以使用 setitimer
函数来实现定时器功能。setitimer
函数能够设置间隔性的定时器,当定时器到期时,会向进程发送信号。以下是具体的实现代码及解释:
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/time.h>
// 信号处理函数
void timer_handler(int signum) {
printf("定时器触发,执行打印任务\n");
}
int main() {
struct itimerval timer;
// 注册信号处理函数
signal(SIGALRM, timer_handler);
// 设置定时器,首次触发时间和周期
timer.it_value.tv_sec = 2; // 首次触发时间为2秒
timer.it_value.tv_usec = 0;
timer.it_interval.tv_sec = 2; // 周期为2秒
timer.it_interval.tv_usec = 0;
// 设置定时器
if (setitimer(ITIMER_REAL, &timer, NULL) == -1) {
perror("setitimer");
return 1;
}
printf("定时器已启动,按任意键取消定时任务...\n");
getchar();
// 取消定时器
timer.it_value.tv_sec = 0;
timer.it_value.tv_usec = 0;
timer.it_interval.tv_sec = 0;
timer.it_interval.tv_usec = 0;
if (setitimer(ITIMER_REAL, &timer, NULL) == -1) {
perror("取消定时器时出错");
return 1;
}
printf("定时任务已取消\n");
return 0;
}
代码思路解释
-
信号处理函数
timer_handler
:- 当定时器到期时,系统会发送
SIGALRM
信号,这个函数就是该信号的处理函数,在其中执行我们想要的打印任务。
- 当定时器到期时,系统会发送
-
设置定时器:
- 使用
struct itimerval
结构体来设置定时器的首次触发时间(it_value
)和周期(it_interval
)。 it_value.tv_sec
和it_value.tv_usec
分别设置首次触发时间的秒数和微秒数。it_interval.tv_sec
和it_interval.tv_usec
分别设置定时器周期的秒数和微秒数。- 使用
setitimer
函数来启动定时器,第一个参数ITIMER_REAL
表示使用系统实时时钟,定时器到期时发送SIGALRM
信号。
- 使用
-
取消定时器:
- 通过将
it_value
和it_interval
的秒数和微秒数都设置为0,然后再次调用setitimer
函数,即可取消定时器。
- 通过将
这样就实现了在Linux系统下使用C语言创建一个定时器并执行简单打印任务,同时也提供了取消定时任务的方法。