У меня есть обработчик сигнала для сигнала таймера.Это часть библиотеки, и я не хотел бы делать никаких предположений о каких-либо других обработчиках таймера, которые вызывающая программа уже включила, поэтому я бы хотел, чтобы мой обработчик запускал только мои события и вызывал обработчик по умолчанию для всехдругие события.
Я видел несколько сообщений на эту тему, и большинство из них предлагают переопределить обработчик сигнала обратно к исходному обработчику, а затем повторно поднять сигнал.Моя проблема с этим заключается в том, что если какой-то другой сигнал прервал мой, я больше не буду вызываться при следующем экземпляре сигнала.Для этого я нашел решение, где вы можете напрямую вызвать старый обработчик сигнала.У меня есть следующее:
/* Set up signal handler. */
if (sigaction(sigNo, &sa, &old_sa) == -1)
...
te.sigev_value.sival_ptr = my_timer_id;
timer_create(CLOCK_REALTIME, &te, my_timer_id);
...
static void
my_timer_handler(int sig, siginfo_t *si, void *uc) {
timer_t *tidp = si->si_value.sival_ptr;
if ( *tidp == my_timer_id ) {
// do my stuff
} else {
if (old_sa.sa_sigaction) {
(*old_sa.sa_sigaction)(sig, si, uc);
} else if(old_sa.sa_handler)
(*old_sa.sa_handler)(sig);
}
}
Но это тоже недостаток - в соответствии с man-страницей для sigaction:
В некоторых архитектурах участвует объединение: doне присваивается как sa_handler, так и sa_sigaction.
, что означает, что я мог вызвать неправильную функцию.Итак, есть ли стандартный способ вызова правильного обработчика сигнала?