почему невозможно иметь несколько таймеров с одним обработчиком. Я использовал программу из приведенной ниже ссылки, и она не работает. Он объяснил причину проблемы, но это не очень понятно. Кто-нибудь помогает мне, почему это не работает? 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 %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);
}