MST

星途 面试题库

面试题:C语言中timer_create()函数的基本使用

在Linux环境下,使用C语言调用timer_create()函数实现一个简单的定时器,当定时器到期时打印一条指定的信息,例如'定时器已触发'。请写出关键代码片段,并简要说明timer_create()函数各个参数的作用。
30.8万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

关键代码片段

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

// 信号处理函数
void handler(int signum) {
    printf("定时器已触发\n");
}

int main() {
    struct sigevent sevp;
    timer_t timerid;
    struct itimerspec its;

    // 初始化sigevent结构体
    sevp.sigev_notify = SIGEV_SIGNAL;
    sevp.sigev_signo = SIGUSR1;
    // 创建定时器
    if (timer_create(CLOCK_REALTIME, &sevp, &timerid) == -1) {
        perror("timer_create");
        exit(EXIT_FAILURE);
    }

    // 注册信号处理函数
    struct sigaction sa;
    sa.sa_handler = handler;
    sigemptyset(&sa.sa_mask);
    sa.sa_flags = 0;
    if (sigaction(SIGUSR1, &sa, NULL) == -1) {
        perror("sigaction");
        exit(EXIT_FAILURE);
    }

    // 设置定时器初始值和周期
    its.it_value.tv_sec = 2;  // 初始延迟2秒
    its.it_value.tv_nsec = 0;
    its.it_interval.tv_sec = 2; // 周期为2秒
    its.it_interval.tv_nsec = 0;

    // 启动定时器
    if (timer_settime(timerid, 0, &its, NULL) == -1) {
        perror("timer_settime");
        exit(EXIT_FAILURE);
    }

    // 等待信号
    while (1) {
        pause();
    }

    return 0;
}

timer_create()函数参数作用

  • clockid_t clockid:指定定时器使用的时钟类型。常见的有 CLOCK_REALTIME(系统实时时钟,与系统时间同步)、CLOCK_MONOTONIC(单调递增时钟,不受系统时间调整影响)等。
  • struct sigevent *sevp:一个指向 sigevent 结构体的指针,用于指定定时器到期时的通知方式。可以设置为通过信号通知(SIGEV_SIGNAL)、通过线程函数通知(SIGEV_THREAD)等。在上述代码中,设置为通过 SIGUSR1 信号通知。
  • timer_t *timerid:一个指向 timer_t 类型变量的指针,函数成功返回时,会将创建的定时器ID存储在该变量中。后续对定时器的操作(如启动、停止)需要使用这个ID。