int main()
{
int i=0;
timer_t t_id[100];
for(i=0; i<100; i++)
makeTimer(NULL, &t_id[i], i+1, 0);
/* Do busy work. */
while (1);
}
static int makeTimer(char *name, timer_t *timerID, int sec, int msec)
{
struct sigevent te;
struct itimerspec its;
struct sigaction sa;
int sigNo = SIGRTMIN;
/* Set up signal handler. */
sa.sa_flags = SA_SIGINFO;
sa.sa_sigaction = timer_handler;
sigemptyset(&sa.sa_mask);
if (sigaction(sigNo, &sa, NULL) == -1)
{
printf("sigaction error\n");
return -1;
}
/* Set and enable alarm */
te.sigev_notify = SIGEV_SIGNAL;
te.sigev_signo = sigNo;
te.sigev_value.sival_ptr = timerID;
timer_create(CLOCK_REALTIME, &te, timerID);
its.it_interval.tv_sec = sec;
its.it_interval.tv_nsec = msec * 1000000;
its.it_value.tv_sec = sec;
its.it_value.tv_nsec = msec * 1000000;
timer_settime(*timerID, 0, &its, NULL);
return 0;
}
static void timer_handler(int sig, siginfo_t *si, void *uc)
{
timer_t *tidp;
tidp = si->si_value.sival_ptr;
/* how to know the timer_id with index? */
}
В этом коде я сделал несколько таймеров, id которых сделан из структуры массива.Как обрабатывать несколько сигналов таймера
Если произошло событие тайм-аута, то весь таймер использует один таймер-манипулятор. Но как я могу узнать, какой тайм-аут индекса (t_id [index]) произошел?
Возможно ли это? Я хочу сказать, что я хочу знать, какой временной интервал индекса произошел.
Вы можете иметь 'sival_ptr' точку на структуру, которая включает в себя элемент, который идентифицирует, который таймер уволил. – EOF
Но как узнать индекс таймера в обработчике? 'если (* tidp == t_id [0]) еще если (* tidp == t_id [1]) еще если (* tidp == t_id [2]) ...' слишком большой для решения многих таймеров – allen
Как @EOF сказал, используйте структуру. Структура может содержать идентификатор 'timer_t' и индекс массива (или другой уникальный идентификатор для конкретного таймера). Затем создайте массив этой структуры вместо массива 'timer_t'. –