Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何解决linux定时器信号处理程序_C++_C_Linux_Timer_Handler - Fatal编程技术网

C++ 如何解决linux定时器信号处理程序

C++ 如何解决linux定时器信号处理程序,c++,c,linux,timer,handler,C++,C,Linux,Timer,Handler,为什么不可能有一个带有单个处理程序的多定时器。我使用了下面链接中的程序,但它不工作。他已经解释了这个问题的原因,但不是很清楚。有人帮我吗?为什么不起作用?? 没有理由不能使用同一个处理程序使用timer\u create创建多个计时器,如果您的sigval结构包含足够的信息,以便在处理程序中根据需要区分它们。没有理由不能使用同一处理程序使用timer\u create创建多个计时器,如果您的sigval结构包含足够的信息,以便在处理程序中根据需要区分它们。本文的要点是,可以让多个计时器触发同一个

为什么不可能有一个带有单个处理程序的多定时器。我使用了下面链接中的程序,但它不工作。他已经解释了这个问题的原因,但不是很清楚。有人帮我吗?为什么不起作用??
没有理由不能使用同一个处理程序使用
timer\u create
创建多个计时器,如果您的
sigval
结构包含足够的信息,以便在处理程序中根据需要区分它们。

没有理由不能使用同一处理程序使用
timer\u create
创建多个计时器,如果您的
sigval
结构包含足够的信息,以便在处理程序中根据需要区分它们。

本文的要点是,可以让多个计时器触发同一个处理程序,但您需要根据传递的一些数据来区分它们。奇怪的是,作者使用的例子只占了代码中说明这一点距离的四分之三,所以这可能是你困惑的根源

希望这篇文章程序的修改更清晰一些。它使用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);
}
\define\u POSIX\u C\u SOURCE 199309
#包括
#包括
#包括
#包括
#包括
#定义errExit(msg)do{perror(msg);exit(exit_FAILURE);}while(0)
无效时间句柄(int sig、siginfo\u t*si、无效*uc)
{
//义务人警告不要使用printf和其他异步不安全调用
//在实际程序中的处理程序中
printf(“我是计时器%s\n”,(char*)si->si_value.sival_ptr);
}
void makeTimer(字符*名称,整数间隔)
{
结构sigte;
结构itimerspec its;
struct-sigaction-sa;
int sigNo=SIGRTMIN;
//设置信号处理器。
sa.sa_flags=sa_SIGINFO;
sa.sa_sigaction=timerHandler;
sigemptyset(和sa.sa_面具);
if(sigaction(sigNo,&sa,NULL)=-1)
errExit(“sigaction”);
//设置计时器
te.sigev_notify=sigev_信号;
te.sigev_signo=signo;
te.sigev_value.sival_ptr=名称;
计时器\u t timerID;
如果(计时器\u创建(时钟\u实时,&te,&timerID)=-1)
errExit(“计时器创建”);
its.it_value.tv_sec=间隔;
its.it\u value.tv\u nsec=0;
its.it_interval.tv_sec=0;
its.it\u interval.tv\u nsec=0;
if(timer_settime(timerID,0,&its,NULL)=-1)
errExit(“计时器设置时间”);
返回;
}
int main(int argc,char*argv[])
{
char*arr[3]={“一号”、“二号”、“三号”};
makeTimer(arr[0],1);
makeTimer(arr[1],2);
makeTimer(arr[2],3);
睡眠(5);
返回(0);
}

本文的要点是,可以让多个计时器触发同一个处理程序,但您需要根据传递的一些数据来区分它们。奇怪的是,作者使用的例子只占了代码中说明这一点距离的四分之三,所以这可能是你困惑的根源

希望这篇文章程序的修改更清晰一些。它使用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);
}
\define\u POSIX\u C\u SOURCE 199309
#包括
#包括
#包括
#包括
#包括
#定义errExit(msg)do{perror(msg);exit(exit_FAILURE);}while(0)
无效时间句柄(int sig、siginfo\u t*si、无效*uc)
{
//义务人警告不要使用printf和其他异步不安全调用
//在实际程序中的处理程序中
printf(“我是计时器%s\n”,(char*)si->si_value.sival_ptr);
}
void makeTimer(字符*名称,整数间隔)
{
结构sigte;
结构itimerspec its;
struct-sigaction-sa;
int sigNo=SIGRTMIN;
//设置信号处理器。
sa.sa_flags=sa_SIGINFO;
sa.sa_sigaction=timerHandler;
sigemptyset(和sa.sa_面具);
if(sigaction(sigNo,&sa,NULL)=-1)
errExit(“sigaction”);
//设置计时器
te.sigev_notify=sigev_信号;
te.sigev_signo=signo;
te.sigev_value.sival_ptr=名称;
计时器\u t timerID;
如果(计时器\u创建(时钟\u实时,&te,&timerID)=-1)
errExit(“计时器创建”);
its.it_value.tv_sec=间隔;
its.it\u value.tv\u nsec=0;
its.it_interval.tv_sec=0;
its.it\u interval.tv\u nsec=0;
if(timer_settime(timerID,0,&its,NULL)=-1)
errExit(“计时器设置时间”);
返回;
}
int main(int argc,char*argv[])
{
char*arr[3]={“一号”、“二号”、“三号”};
makeTimer(arr[0],1);
makeTimer(arr[1],2);
makeTimer(arr[2],3);
睡眠(5);
返回(0);
}

您是否在我的问题中查看了上述链接??你能做到的!!但在某些情况下,这是不可能的。我认为我的观点与他相同。您的处理程序需要区分哪个计时器正在运行。@user3354789,abligh是正确的。你需要从认为自己是对的转变为理解自己为什么错了。公平地说,该示例中的代码相当蹩脚,在演示如何工作时只使用了3/4的方式。如何每2ms、10ms和100ms调用一次特定任务?您是否检查了我问题中的上述链接??你能做到的!!但在某些情况下,这是不可能的。我认为我的观点与他相同。您的处理程序需要区分哪个计时器正在运行。@user3354789,abligh是正确的。你需要从认为自己是对的转变为理解自己为什么错了。公平地说,该示例中的代码相当蹩脚,在演示如何工作时仅占3/4。如何每2ms、10ms和100ms调用一次特定任务?但是如何每2ms调用一次特定任务,10毫秒和100毫秒??你的代码与我在上面发布的链接有多大不同?我所做的更改主要是删除了无关的内容和changi