C语言多定时器并行计时程序详解 - 代码注释及解释
#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;
}
原文地址: https://www.cveoy.top/t/topic/gN1G 著作权归作者所有。请勿转载和采集!