如何解决 Linux 计时器信号处理程序
how to solve the linux timer signal handler
为什么不可能有一个带有单个处理程序的多个计时器。我从下面的链接中使用了该程序,但它不起作用。他已经解释了问题的原因,但不是很清楚。有人帮我为什么它不起作用吗?http://www.graphics-muse.org/wp/?p=868
没有
理由不能使用同一处理程序创建多个timer_create
计时器,前提是sigval
结构包含足够的信息,可以在处理程序中根据需要区分它们。
本文的要点是,可以让多个计时器触发相同的处理程序,但您需要根据一些传递的数据来区分它们。 奇怪的是,作者使用的示例只在代码中说明了这一点的 3/4,所以也许这就是您混淆的根源。
希望对文章程序的修改更清晰一些。 它使用 sival_ptr 指向字符串,但可以指向任何类型的字符串。 这就是计时器的区别。
#define _POSIX_C_SOURCE 199309
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
#include <time.h>
#define errExit(msg) do { perror(msg); exit(EXIT_FAILURE); } while (0)
void timerHandler( int sig, siginfo_t *si, void *uc )
{
// obligator caution not to use printf and other async-unsafe calls
// in a handler in real programs
printf("I am timer %sn", (char *) si->si_value.sival_ptr);
}
void makeTimer(char *name, int intervalMS)
{
struct sigevent te;
struct itimerspec its;
struct sigaction sa;
int sigNo = SIGRTMIN;
// Set up signal handler.
sa.sa_flags = SA_SIGINFO;
sa.sa_sigaction = timerHandler;
sigemptyset(&sa.sa_mask);
if (sigaction(sigNo, &sa, NULL) == -1)
errExit("sigaction");
// Set up timer
te.sigev_notify = SIGEV_SIGNAL;
te.sigev_signo = sigNo;
te.sigev_value.sival_ptr = name;
timer_t timerID;
if (timer_create(CLOCK_REALTIME, &te, &timerID) == -1)
errExit("timer_create");
its.it_value.tv_sec = intervalMS;
its.it_value.tv_nsec = 0;
its.it_interval.tv_sec = 0;
its.it_interval.tv_nsec = 0;
if (timer_settime(timerID, 0, &its, NULL) == -1)
errExit("timer_settime");
return;
}
int main(int argc, char *argv[])
{
char *arr[3] = {"number one", "number two", "number three"};
makeTimer(arr[0], 1);
makeTimer(arr[1], 2);
makeTimer(arr[2], 3);
while (sleep(5));
return(0);
}
相关文章:
- Linux的Cpp上的计时器
- 提升 ASIO 无法识别计时器对象
- 提升 asio 并发计时器取消问题与链
- 使用单体计时器的pthread_cond_timedwait有时会比预期晚超时
- 窗口中的微秒计时器
- 计时器是否从另一个线程启动?
- 如何在 c++ 中创建计时器
- C++回调计时器实现
- 在计时器或主线程外部的命令上销毁/替换线程
- 如何制作每秒从 30 乘 1 倒计时的计时器?
- 保留计时器集合(对象与指针)的最佳方法
- 在网络套接字计时器滴答后增加asio短读错误
- 是否可以仅使用标准 c++/c++11 实现不带"sleep"的计时器?
- 在没有NtSetTimerResolution的Windows上提高计时器分辨率(高分辨率)
- Linux 计时器挂起信号
- 如何设置一个"precise"的定期计时器来监控Linux(C / C++)中的内容?
- C++如何在Linux中使计时器准确
- 如何解决 Linux 计时器信号处理程序
- boost deadline_timer语言 - Linux 中的最大计时器数量
- Windows(也包括OS X、Linux)上Qt中的高分辨率定期计时器