MST

星途 面试题库

面试题:C语言实现Linux定时器基础

在Linux环境下,使用C语言编写一个简单的定时器,要求每隔1秒打印一次当前系统时间,描述下使用的定时器函数原理及实现思路。
47.5万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

实现代码

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <time.h>
#include <unistd.h>

// 信号处理函数
void print_time(int signum) {
    time_t now;
    struct tm *tm_info;

    time(&now);
    tm_info = localtime(&now);

    char time_str[26];
    strftime(time_str, 26, "%Y-%m-%d %H:%M:%S", tm_info);
    printf("Current time: %s\n", time_str);
}

int main() {
    // 设置信号处理函数
    if (signal(SIGALRM, print_time) == SIG_ERR) {
        perror("signal");
        return 1;
    }

    // 设置定时器,每1秒触发一次SIGALRM信号
    alarm(1);

    // 进入无限循环,防止程序退出
    while (1) {
        pause();
    }

    return 0;
}

定时器函数原理

这里使用alarm函数来实现定时器功能。alarm函数的作用是设置一个定时器(闹钟),当经过指定的秒数后,内核会向进程发送SIGALRM信号。

函数原型为:unsigned int alarm(unsigned int seconds);

  • seconds参数指定了定时器触发的时间(以秒为单位)。
  • 返回值是之前设置的闹钟剩余的秒数,如果之前没有设置闹钟,则返回0。

实现思路

  1. 定义信号处理函数:编写一个信号处理函数print_time,当接收到SIGALRM信号时,获取当前系统时间并打印。
  2. 设置信号处理函数:在main函数中,使用signal函数将SIGALRM信号与print_time函数关联起来。
  3. 启动定时器:使用alarm函数设置定时器,让其每隔1秒触发一次SIGALRM信号。
  4. 防止程序退出:进入一个无限循环while(1),并使用pause函数使进程暂停,等待信号的到来。当SIGALRM信号到达时,会调用print_time函数,之后进程继续在pause处等待下一个信号。