2016-06-16 2 views
0
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]) произошел?

Возможно ли это? Я хочу сказать, что я хочу знать, какой временной интервал индекса произошел.

+2

Вы можете иметь 'sival_ptr' точку на структуру, которая включает в себя элемент, который идентифицирует, который таймер уволил. – EOF

+0

Но как узнать индекс таймера в обработчике? 'если (* tidp == t_id [0]) еще если (* tidp == t_id [1]) еще если (* tidp == t_id [2]) ...' слишком большой для решения многих таймеров – allen

+1

Как @EOF сказал, используйте структуру. Структура может содержать идентификатор 'timer_t' и индекс массива (или другой уникальный идентификатор для конкретного таймера). Затем создайте массив этой структуры вместо массива 'timer_t'. –

ответ

1

Простой пример использования структуры:

struct timer_event_data 
{ 
    timer_t id; 
    size_t index; // Array index, not really needed IMO 
    // Other possible data 
}; 

#define NUMBER_TIMER_EVENTS 100 

int main(void) 
{ 
    struct timer_event_data timer_data[NUMBER_TIMER_EVENTS]; 

    for (size_t i = 0; i < NUMBER_TIMER_EVENTS; ++i) 
    { 
     // Initialize structure 
     timer_data[i].index = i; 

     // Start timer 
     makeTimer(NULL, &timer_data[i], i + 1, 0); 
    } 

    // Main processing loop 
    for (;;) 
    { 
     // ... 
    } 

    return 0; 
} 

void makeTimer(const char *name, struct timer_event_data *timer_data, unsigned sec, unsigned msec) 
{ 
    ... 
    te.sigev_value.sival_ptr = timer_data; 
    timer_create(CLOCK_REALTIME, &te, &timer_data->id); 
    ... 
} 

static void timer_handler(int sig, siginfo_t *si, void *uc) 
{ 
    struct timer_event_data *timer_data = si->si_value.sival_ptr; 
    // Use data in structure any way you want 
} 
0

Вы могли определить глобальный указатель на t_id «s 1-го элемента:

timer_t * pt_id; 

отформатируйте ее в main():

timer_t t_id[100]; 
pt_id = t_id; 

И затем внутри функции таймера вычислить индекс, необходимый, принимая разница в таком массиве:

size_t tidx = tidp - pt_id - 1; 
+1

* Eww *, глобальный. И это даже не может быть 'const'. – EOF

+0

@EOF: Я написал «* could *» ... ;-) – alk

Смежные вопросы