触发两个定时器:

#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;
}

 

posted on 2025-07-25 22:57  轩~邈  阅读(22)  评论(0)    收藏  举报