参考文章:
linux定时器_车小猿的博客-CSDN博客_linux 定时器
Linux下实现定时器Timer的几种方法_dengjingen的博客-CSDN博客_linux timer
#include <stdio.h>
#include <time.h>
#include <sys/time.h>
#include <signal.h>
#include <sys/time.h>
//事件1
void timeout1(int sig)
{
time_t times=0;
printf("tick time:%ld\n", time(×));
}
void create_timer_by_signal(void)
{
static timer_t times;
struct itimerspec ts; //用于配置定时器时间
struct timespec now; //获取linux系统时间
struct sigevent evp;
evp.sigev_notify = SIGEV_SIGNAL;
evp.sigev_signo = SIGUSR1;
evp.sigev_value.sival_ptr = ×
evp.sigev_notify_attributes = NULL;
timer_create(CLOCK_REALTIME, &evp, ×);
/*第一次调用后,每次调用间隔时间*/
ts.it_interval.tv_sec = 0;
ts.it_interval.tv_nsec = 100000000; // 1000ns = 1us 1000us = 1ms 1000ms = 1s
/*第一次调用时间*/
ts.it_value.tv_sec = 1;
ts.it_value.tv_nsec = 0;
signal(SIGUSR1, timeout1);
timer_settime(times, 0, &ts, NULL);
}
int main()
{
create_timer_by_signal();
while(1);
}
#include <stdio.h>
#include <signal.h>
#include <time.h>
#include <sys/time.h>
void timeout1(int sig)
{
time_t times=0;
printf("tick time:%ld\n", time(×) );
}
void tm_timeout(union sigval value)
{
printf("create time sifval:%X\n", value.sival_int);
}
void create_time_by_thread(void)
{
static timer_t times;
struct itimerspec ts; //用于配置定时器时间
struct sigevent evp;
evp.sigev_notify = SIGEV_THREAD;
evp.sigev_notify_function = tm_timeout;
evp.sigev_value.sival_int = 0xFEDC; //传递参数给 tm_timeout函数
evp.sigev_notify_attributes = NULL;
timer_create(CLOCK_REALTIME, &evp, ×);
if(1)
{
//第一次调用后,每次调用间隔时间,若不需要周期性启动定时器可将 下面两个参数设置值为0
ts.it_interval.tv_sec = 3;
ts.it_interval.tv_nsec = 0;
//第一次调用时间
ts.it_value.tv_sec =7;
ts.it_value.tv_nsec = 0;
if(0 != timer_settime(times, 0, &ts, NULL))
{
printf("create timer to start failed\n");
}
}
else
{
struct timespec now; //获取linux系统时间
clock_gettime(CLOCK_REALTIME, &now);
ts.it_value.tv_sec =now.tv_sec + 7;
ts.it_value.tv_nsec = now.tv_nsec + 0;
if(0 != timer_settime(times, TIMER_ABSTIME, &ts, NULL)) //绝对时间启动定时器
{
printf("create timer to start failed\n");
}
}
}
void create_timer_by_signal(void)
{
static timer_t times;
struct itimerspec ts; //用于配置定时器时间
struct timespec now; //获取linux系统时间
struct sigevent evp;
evp.sigev_notify = SIGEV_SIGNAL;
evp.sigev_signo = SIGUSR1;
evp.sigev_value.sival_ptr = ×
evp.sigev_notify_attributes = NULL;
timer_create(CLOCK_REALTIME, &evp, ×);
/*第一次调用后,每次调用间隔时间*/
ts.it_interval.tv_sec = 3;
ts.it_interval.tv_nsec = 0;
/*第一次调用时间*/
ts.it_value.tv_sec =5;
ts.it_value.tv_nsec = 0;
signal(SIGUSR1, timeout1);
timer_settime(times, 0, &ts, NULL);
}
int main(int argc, char *argv[])
{
create_time_by_thread();
create_timer_by_signal();
while(1);
return 0;
}