MST

星途 面试题库

面试题:C语言中在Linux环境下如何实现一个简单的定时器并取消定时任务

请描述在Linux系统中,使用C语言实现一个定时器,该定时器执行一个简单的打印任务,并且要给出如何取消这个定时任务的具体代码实现及思路。
40.2万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

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

代码思路解释

  1. 信号处理函数 timer_handler

    • 当定时器到期时,系统会发送 SIGALRM 信号,这个函数就是该信号的处理函数,在其中执行我们想要的打印任务。
  2. 设置定时器

    • 使用 struct itimerval 结构体来设置定时器的首次触发时间(it_value)和周期(it_interval)。
    • it_value.tv_secit_value.tv_usec 分别设置首次触发时间的秒数和微秒数。
    • it_interval.tv_secit_interval.tv_usec 分别设置定时器周期的秒数和微秒数。
    • 使用 setitimer 函数来启动定时器,第一个参数 ITIMER_REAL 表示使用系统实时时钟,定时器到期时发送 SIGALRM 信号。
  3. 取消定时器

    • 通过将 it_valueit_interval 的秒数和微秒数都设置为0,然后再次调用 setitimer 函数,即可取消定时器。

这样就实现了在Linux系统下使用C语言创建一个定时器并执行简单打印任务,同时也提供了取消定时任务的方法。