#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/time.h>

#define INTERVAL 500 // 定时器间隔时间,单位为毫秒

int count1 = 0; // 计数器1
int count2 = 0; // 计数器2
int count3 = 0; // 计数器3

void handler1(int signum) { // 定时器1的处理函数
    count1++;
    printf('Timer 1: %d
', count1);
}

void handler2(int signum) { // 定时器2的处理函数
    count2++;
    printf('Timer 2: %d
', count2);
}

void handler3(int signum) { // 定时器3的处理函数
    count3++;
    printf('Timer 3: %d
', count3);
}

int main() {
    struct itimerval itv1, itv2, itv3; // 定义三个定时器结构体
    struct sigaction act1, act2, act3; // 定义三个信号处理结构体

    // 设置定时器1
    itv1.it_interval.tv_sec = INTERVAL / 1000; // 定时器1的间隔时间(秒)
    itv1.it_interval.tv_usec = (INTERVAL % 1000) * 1000; // 定时器1的间隔时间(微秒)
    itv1.it_value.tv_sec = INTERVAL / 1000; // 定时器1的初始时间(秒)
    itv1.it_value.tv_usec = (INTERVAL % 1000) * 1000; // 定时器1的初始时间(微秒)
    setitimer(ITIMER_REAL, &itv1, NULL); // 将定时器1设置为真实时间定时器

    // 设置定时器2
    itv2.it_interval.tv_sec = INTERVAL / 1000; // 定时器2的间隔时间(秒)
    itv2.it_interval.tv_usec = (INTERVAL % 1000) * 1000; // 定时器2的间隔时间(微秒)
    itv2.it_value.tv_sec = INTERVAL / 1000; // 定时器2的初始时间(秒)
    itv2.it_value.tv_usec = (INTERVAL % 1000) * 1000; // 定时器2的初始时间(微秒)
    setitimer(ITIMER_VIRTUAL, &itv2, NULL); // 将定时器2设置为虚拟时间定时器

    // 设置定时器3
    itv3.it_interval.tv_sec = INTERVAL / 1000; // 定时器3的间隔时间(秒)
    itv3.it_interval.tv_usec = (INTERVAL % 1000) * 1000; // 定时器3的间隔时间(微秒)
    itv3.it_value.tv_sec = INTERVAL / 1000; // 定时器3的初始时间(秒)
    itv3.it_value.tv_usec = (INTERVAL % 1000) * 1000; // 定时器3的初始时间(微秒)
    setitimer(ITIMER_PROF, &itv3, NULL); // 将定时器3设置为CPU时间定时器

    // 设置定时器1的信号处理函数
    act1.sa_handler = handler1; // 指定处理函数
    sigemptyset(&act1.sa_mask); // 清空信号屏蔽字
    act1.sa_flags = 0; // 指定标志位
    sigaction(SIGALRM, &act1, NULL); // 指定信号处理函数

    // 设置定时器2的信号处理函数
    act2.sa_handler = handler2; // 指定处理函数
    sigemptyset(&act2.sa_mask); // 清空信号屏蔽字
    act2.sa_flags = 0; // 指定标志位
    sigaction(SIGVTALRM, &act2, NULL); // 指定信号处理函数

    // 设置定时器3的信号处理函数
    act3.sa_handler = handler3; // 指定处理函数
    sigemptyset(&act3.sa_mask); // 清空信号屏蔽字
    act3.sa_flags = 0; // 指定标志位
    sigaction(SIGPROF, &act3, NULL); // 指定信号处理函数

    while(1) { // 主循环,保证程序一直运行
        sleep(1);
    }

    return 0;
}
C语言多定时器并行计时程序详解 - 代码注释及解释

原文地址: https://www.cveoy.top/t/topic/gN1G 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录