为什么不能使用单个处理程序的多个计时器。我使用了以下链接中的程序,但它无法正常工作。他已经解释了问题的原因,但不是很清楚。有人帮助我为什么不工作? http://www.graphics-muse.org/wp/?p=868
答案 0 :(得分:2)
如果您的timer_create
结构包含足以在处理程序中根据需要区分它们的信息,则没有理由不能使用sigval
使用相同的处理程序创建多个计时器。
答案 1 :(得分:2)
文章的重点是 可能有多个计时器触发相同的处理程序,但您需要根据一些传递的数据区分它们。奇怪的是,作者使用的例子仅仅是在代码中说明这个距离的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 %s\n", (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);
}