MST

星途 面试题库

面试题:C语言中Linux定时器在多线程服务器里如何初始化

在Linux C语言环境下,若要在多线程服务器中使用定时器,简述定时器初始化的主要步骤,并且给出使用`timer_create`函数初始化一个POSIX定时器的代码示例,说明每个参数的作用。
21.1万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

定时器初始化主要步骤:

  1. 定义定时器相关变量:定义timer_t类型变量用于表示定时器,以及struct sigevent结构体用于设置定时器触发事件的行为。
  2. 初始化struct sigevent结构体:设置sigev_notify成员指定定时器到期时的通知方式,如SIGEV_SIGNAL表示发送信号通知,SIGEV_THREAD表示创建线程通知等。同时设置其他相关成员,如sigev_signo指定发送的信号(若sigev_notifySIGEV_SIGNAL)。
  3. 调用timer_create函数创建定时器:传递合适的参数来创建定时器,成功则返回0,失败返回 -1 并设置errno

timer_create函数初始化POSIX定时器代码示例:

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

// 信号处理函数
void signal_handler(int signum) {
    printf("Timer expired!\n");
}

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

    // 初始化sigevent结构体
    sev.sigev_notify = SIGEV_SIGNAL;
    sev.sigev_signo = SIGUSR1;
    sev.sigev_value.sival_ptr = &timerid;

    // 创建定时器
    if (timer_create(CLOCK_REALTIME, &sev, &timerid) == -1) {
        perror("timer_create");
        exit(EXIT_FAILURE);
    }

    // 设置信号处理函数
    struct sigaction sa;
    sa.sa_handler = signal_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 = 1;  // 周期为1秒
    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:指定定时器使用的时钟类型,如CLOCK_REALTIME表示系统实时时钟,CLOCK_MONOTONIC表示单调递增时钟(不受系统时间调整影响)等。
  • 第二个参数evp:指向struct sigevent结构体的指针,用于设置定时器到期时的通知方式和相关参数。
  • 第三个参数timerid:指向timer_t类型变量的指针,用于接收创建的定时器ID。