代码之家  ›  专栏  ›  技术社区  ›  HardcoreHenry

直接从新信号处理程序调用默认信号处理程序

  •  0
  • HardcoreHenry  · 技术社区  · 6 年前

    我已经看过几篇关于这个主题的文章,大多数都建议将信号处理程序重写回原始处理程序,然后重新提升信号。我的问题是,如果其他人的信号抢占了我的信号,我就不会再在下一个信号实例中被调用。为此,我找到了一个解决方案,您可以直接调用旧的信号处理程序。我的情况如下:

    /* 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。

    1 回复  |  直到 6 年前
        1
  •  3
  •   bca    6 年前

    sigevent 结构-计时器参数\u create-将是更好的解决方案。您可以将此答案视为一个示例: https://stackoverflow.com/a/38356989/8067109

    如果你想那样做,你应该检查一下 SA_SIGINFO 旗帜。sau SIGINFO标志告诉sigaction()使用sau sigaction字段。

    if (old_sa.sa_flags & SA_SIGINFO) {
           (*old_sa.sa_sigaction)(sig, si, uc);
     else 
           (*old_sa.sa_handler)(sig);