定时器初始化主要步骤:
- 定义定时器相关变量:定义
timer_t
类型变量用于表示定时器,以及struct sigevent
结构体用于设置定时器触发事件的行为。
- 初始化
struct sigevent
结构体:设置sigev_notify
成员指定定时器到期时的通知方式,如SIGEV_SIGNAL
表示发送信号通知,SIGEV_THREAD
表示创建线程通知等。同时设置其他相关成员,如sigev_signo
指定发送的信号(若sigev_notify
为SIGEV_SIGNAL
)。
- 调用
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。