Linux 内核是多任务操作系统,定时器并不是实时的,可能会存在一定的误差。如果需要更精确的定时器,可以考虑使用定时器中断来实现。
最强大的定时器接口来自POSIX时钟系列,其创建、初始化以及删除一个定时器的行动被分为三个不同的函数:timer_create()(创建定时器)、timer_settime()(初始化定时器)以及timer_delete(销毁它)。可以使用系统调用 timer_create() 和 timer_settime() 来创建和启动一个精准定时器。这个定时器可以定时执行一个指定的函数,实现定时任务的功能
范例代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <time.h>
timer_t timerid;
void timer_handler(int signo)
{
printf("timer expired\n");
}
int main(int argc, char *argv[])
{
struct sigevent sev;
struct itimerspec its;
struct sigaction sa;
// 设置信号处理函数
sa.sa_flags = SA_SIGINFO;
sa.sa_sigaction = timer_handler;
sigemptyset(&sa.sa_mask);
if (sigaction(SIGRTMIN, &sa, NULL) == -1) {
printf("sigaction() failed\n");
return 1;
}
// 创建定时器
sev.sigev_notify = SIGEV_SIGNAL;
sev.sigev_signo = SIGRTMIN;
sev.sigev_value.sival_ptr = &timerid;
if (timer_create(CLOCK_REALTIME, &sev, &timerid) == -1) {
printf("timer_create() failed\n");
return 1;
}
// 设置定时器
its.it_value.tv_sec = 1;
its.it_value.tv_nsec = 0;
its.it_interval.tv_sec = 1;
its.it_interval.tv_nsec = 0;
if (timer_settime(timerid, 0, &its, NULL) == -1) {
printf("timer_settime() failed\n");
return 1;
}
// 等待定时器事件
while (1) {
sleep(1);
}
return 0;
}