как решить обработчик сигнала таймера Linux

0

почему невозможно иметь несколько таймеров с одним обработчиком. Я использовал программу из приведенной ниже ссылки, и она не работает. Он объяснил причину проблемы, но это не очень понятно. Кто-нибудь помогает мне, почему это не работает? http://www.graphics-muse.org/wp/?p=868

Теги:
handler
timer

2 ответа

2

Нет причин, по которым вы не можете создать несколько таймеров, созданных с помощью timer_create используя тот же обработчик, если ваша структура sigval содержит достаточно информации, чтобы различать их по мере необходимости в вашем обработчике.

  • 0
    Вы проверили вышеуказанную ссылку в моем вопросе? Вы можете сделать это !! но в некоторых случаях это невозможно
  • 0
    Я думаю, что я делаю то же самое, что и он. Ваш обработчик должен различать, какой из таймеров отключается.
Показать ещё 2 комментария
1

Пункт статьи состоит в том, что возможно, что несколько таймеров запускают один и тот же обработчик, но вам нужно различать их на основе некоторых переданных данных. Как ни странно, пример, который использовал автор, составил 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);
}
  • 0
    но как вызвать конкретную задачу для каждых 2 мс, 10 мс и 100 мс ??
  • 0
    насколько ваш код отличается от ссылки, которую я разместил выше ??
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню