如何解决 Linux 计时器信号处理程序

how to solve the linux timer signal handler

本文关键字:Linux 计时器 信号处理 程序 解决 何解决      更新时间:2023-10-16

为什么不可能有一个带有单个处理程序的多个计时器。我从下面的链接中使用了该程序,但它不起作用。他已经解释了问题的原因,但不是很清楚。有人帮我为什么它不起作用吗?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);
}