#linux #c
Есть несколько таймеров, которые генерируют один и тот же сигнал SIGRTMIN дополнительно передавая в sival_int значение. Есть несколько обработчиков сигнала таймера. Правильно ли я понимаю, что сигнал гарантировано дойдет до всех обработчиков сигнала? А если сигнал сгенерируется одновременно несколькими таймерами? Корректно ли в обработчике проверять sival_int ? #define TIMER_EVENT_ID_1 1 #define TIMER_EVENT_ID_2 2 void timer_handler(int signo, siginfo_t *info, void *context) { if(info->si_value.sival_int==TIMER_EVENT_ID_1) { sem_post(&sem1); //будим трид } if(info->si_value.sival_int==TIMER_EVENT_ID_2) { sem_post(&sem2); //будим трид } } В разных потоках я создаю, а потом сбрасываю и устанавливаю значения таймеров: typedef struct { struct sigevent sigev; struct sigaction sa; struct itimerspec ival; timer_t tid; } timer_data_t; int init_timer(timer_data_t *timer_data, void *handler, UNS8 sigNum, UNS8 eventNum) { timer_data->sa.sa_flags = SA_SIGINFO; sigemptyset(&timer_data->sa.sa_mask); sigaddset(&timer_data->sa.sa_mask, sigNum); timer_data->sa.sa_sigaction=handler; if(sigaction(sigNum, &timer_data->sa, NULL)==-1) { perror("sigaction failed"); return -1; } timer_data->sigev.sigev_notify = SIGEV_SIGNAL; timer_data->sigev.sigev_signo = sigNum; timer_data->sigev.sigev_value.sival_int=eventNum; //создаем таймер if( timer_create(CLOCK_REALTIME, &timer_data->sigev, &timer_data->tid)==-1) { printf("init_timer: не могу создать таймер! \n"); perror("timer_create"); return -1; } return 0; } int set_timer(timer_data_t *timer_data, UNS32 timeSec, UNS64 timeNsec) { timer_data->ival.it_value.tv_sec=timeSec; timer_data->ival.it_value.tv_nsec =timeNsec; timer_data->ival.it_interval.tv_sec=0; timer_data->ival.it_interval.tv_nsec=0; if(timer_settime(timer_data->tid, 0, &timer_data->ival, NULL) == -1) { perror("timer_settime"); return -1; } return 0; } Т.е. вызывая init_timer, я просто изменяю обработчик для конкретного сигнала, т.к. он может быть только один?
Ответы
Ответ 1
Не очень понимаю Ваш вопрос: Правильно ли я понимаю, что сигнал гарантировано дойдет до всех обработчиков сигнала?" Что значит "до всех" ? Сигнал всегда доходит до обработчика сигнала, там обрабатывается и ИСЧЕЗАЕТ! Один сигнал не может дойти до двух обработчиков. В руководстве по сигналам написано, что если сигнал ожидают несколько обработчиков, то кто именно его получит - определяется реализацией.
Комментариев нет:
Отправить комментарий