如何解决linux timer信号处理程序

时间:2014-02-27 14:37:46

标签: c++ c linux timer handler

为什么不能使用单个处理程序的多个计时器。我使用了以下链接中的程序,但它无法正常工作。他已经解释了问题的原因,但不是很清楚。有人帮助我为什么不工作? http://www.graphics-muse.org/wp/?p=868

2 个答案:

答案 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);
}