我已经看过几篇关于这个主题的文章,大多数都建议将信号处理程序重写回原始处理程序,然后重新提升信号。我的问题是,如果其他人的信号抢占了我的信号,我就不会再在下一个信号实例中被调用。为此,我找到了一个解决方案,您可以直接调用旧的信号处理程序。我的情况如下:
/* 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);
}
}
但这也是有缺陷的——根据sigaction的手册页:
在某些体系结构中,涉及到联合:不要同时分配给sa\u处理程序和sa\u sigaction。