触发两个定时器:
#include <signal.h>
#include <time.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
/* 通用的时间打印函数 */
static void print_time(const char *prefix)
{
time_t t;
struct tm *tm;
char buf[32];
time(&t);
tm = localtime(&t);
strftime(buf, sizeof(buf), "%T", tm);
printf("%s: %s\n", prefix, buf);
}
/* 定时器 1 的处理函数 */
void handle1(int sig)
{
(void)sig; /* 避免编译器警告 */
print_time("timer1 tick");
}
/* 定时器 2 的处理函数 */
void handle2(int sig)
{
(void)sig;
print_time("timer2 tick");
}
int main(void)
{
timer_t timer1, timer2;
struct sigevent evp;
struct itimerspec ts;
int ret;
/* 安装信号处理函数 */
signal(SIGUSR1, handle1);
signal(SIGUSR2, handle2);
/* ---------- 定时器 1 ---------- */
memset(&evp, 0, sizeof(evp));
evp.sigev_notify = SIGEV_SIGNAL;
evp.sigev_signo = SIGUSR1;
evp.sigev_value.sival_ptr = &timer1;
ret = timer_create(CLOCK_REALTIME, &evp, &timer1);
if (ret) { perror("timer_create1"); return 1; }
ts.it_value.tv_sec = 3; /* 3 秒后第一次触发 */
ts.it_value.tv_nsec = 0;
ts.it_interval.tv_sec = 10; /* 以后每 1 秒触发一次 */
ts.it_interval.tv_nsec = 0;
ret = timer_settime(timer1, 0, &ts, NULL);
if (ret) { perror("timer_settime1"); return 1; }
/* ---------- 定时器 2 ---------- */
memset(&evp, 0, sizeof(evp));
evp.sigev_notify = SIGEV_SIGNAL;
evp.sigev_signo = SIGUSR2;
evp.sigev_value.sival_ptr = &timer2;
ret = timer_create(CLOCK_REALTIME, &evp, &timer2);
if (ret) { perror("timer_create2"); return 1; }
ts.it_value.tv_sec = 5; /* 5 秒后第一次触发 */
ts.it_value.tv_nsec = 0;
ts.it_interval.tv_sec = 10; /* 以后每 2 秒触发一次 */
ts.it_interval.tv_nsec = 0;
ret = timer_settime(timer2, 0, &ts, NULL);
if (ret) { perror("timer_settime2"); return 1; }
/* 主循环:什么都不做,等待信号到来 */
while (1)
pause(); /* 让 CPU 休眠,降低功耗 */
return 0;
}
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
/* 通用的时间打印函数 */
static void print_time(const char *prefix)
{
time_t t;
struct tm *tm;
char buf[32];
time(&t);
tm = localtime(&t);
strftime(buf, sizeof(buf), "%T", tm);
printf("%s: %s\n", prefix, buf);
fflush(stdout);
}
/* ---------- 定时器 1 的回调 ---------- */
void timer1_thread(union sigval arg)
{
(void)arg; /* 未使用 */
print_time("timer1 tick");
}
/* ---------- 定时器 2 的回调 ---------- */
void timer2_thread(union sigval arg)
{
(void)arg;
print_time("timer2 tick");
}
int main(void)
{
timer_t timer1, timer2;
struct sigevent evp;
struct itimerspec ts;
int ret;
/* ---------- 定时器 1 ---------- */
memset(&evp, 0, sizeof(evp));
evp.sigev_notify = SIGEV_THREAD;
evp.sigev_notify_function = timer1_thread;
evp.sigev_value.sival_ptr = &timer1; /* 可传任意指针给回调 */
ret = timer_create(CLOCK_REALTIME, &evp, &timer1);
if (ret) { perror("timer_create1"); return 1; }
ts.it_value.tv_sec = 3; /* 3 秒后第一次触发 */
ts.it_value.tv_nsec = 0;
ts.it_interval.tv_sec = 10; /* 以后每 1 秒触发一次 */
ts.it_interval.tv_nsec = 0;
ret = timer_settime(timer1, 0, &ts, NULL);
if (ret) { perror("timer_settime1"); return 1; }
/* ---------- 定时器 2 ---------- */
memset(&evp, 0, sizeof(evp));
evp.sigev_notify = SIGEV_THREAD;
evp.sigev_notify_function = timer2_thread;
evp.sigev_value.sival_ptr = &timer2;
ret = timer_create(CLOCK_REALTIME, &evp, &timer2);
if (ret) { perror("timer_create2"); return 1; }
ts.it_value.tv_sec = 5; /* 5 秒后第一次触发 */
ts.it_value.tv_nsec = 0;
ts.it_interval.tv_sec = 10; /* 以后每 2 秒触发一次 */
ts.it_interval.tv_nsec = 0;
ret = timer_settime(timer2, 0, &ts, NULL);
if (ret) { perror("timer_settime2"); return 1; }
/* 主线程无事可做,休眠即可 */
while (1)
pause();
return 0;
}
timer_create使用
浙公网安备 33010602011771号