关键代码片段
#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。