MST

星途 面试题库

面试题:C语言中基于Linux实现简单定时器

在Linux环境下,使用C语言实现一个简单的定时器,每隔1秒输出一条提示信息,说明你所采用的定时器实现机制,例如setitimer函数的使用要点。
29.1万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <sys/time.h>

// 信号处理函数
void timer_handler(int signum) {
    printf("1秒时间到\n");
}

int main() {
    struct itimerval timer;

    // 初始化信号处理函数
    signal(SIGALRM, timer_handler);

    // 设置定时器间隔为1秒
    timer.it_value.tv_sec = 1;
    timer.it_value.tv_usec = 0;
    timer.it_interval.tv_sec = 1;
    timer.it_interval.tv_usec = 0;

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

    // 主循环,防止程序退出
    while (1) {
        sleep(1);
    }

    return 0;
}

setitimer函数使用要点

  1. 函数原型int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value);
  2. 参数说明
    • which:指定定时器类型,常见的有ITIMER_REAL(实时定时器,计时以系统真实时间为准,超时发送SIGALRM信号)、ITIMER_VIRTUAL(以进程运行时间为准,超时发送SIGVTALRM信号)、ITIMER_PROF(以进程运行时间 + 内核调度进程的时间为准,超时发送SIGPROF信号)。在本程序中使用ITIMER_REAL
    • new_value:指向struct itimerval结构体的指针,用于设置定时器的初始值和间隔值。struct itimerval结构体定义如下:
    struct itimerval {
        struct timeval it_interval; /* 定时器周期 */
        struct timeval it_value;    /* 定时器初始值 */
    };
    struct timeval {
        time_t      tv_sec;         /* 秒 */
        suseconds_t tv_usec;        /* 微秒 */
    };
    
    • old_value:若不为NULL,则保存上一次定时器的设置值。
  3. 返回值:成功返回0,失败返回 -1,并设置errno

本程序使用setitimer函数,设置一个ITIMER_REAL类型的定时器,每隔1秒触发一次SIGALRM信号,在信号处理函数中输出提示信息。