如何在C/C+中编程实现SIG IGN或SIG DFL+;? 我想把信号处理机制封装成C++类,比如WNDPROC的消息调度到儿童窗口。

如何在C/C+中编程实现SIG IGN或SIG DFL+;? 我想把信号处理机制封装成C++类,比如WNDPROC的消息调度到儿童窗口。,c++,linux,signals,C++,Linux,Signals,不幸的是,某些处理程序需要特殊操作,如SIG_IGN、SIG_DFL或SIG_ERR。例如,nohup使用SIG\u IGN忽略SIGHUP。 对于信号主机,可能会发生许多情况 针对SIGSEGV执行的信号处理程序A: 这将执行printf(“SIGSEGV!\n”)仅限 针对SIGSEGV执行的信号处理程序B 这需要绕过流入SIG_-DFL的流,或者像处理SIG_-DFL一样处理它 在linux系统中,定义的信号处理程序只是一个伪引用,如#define SIG_DFL((signandler_

不幸的是,某些处理程序需要特殊操作,如SIG_IGN、SIG_DFL或SIG_ERR。例如,
nohup
使用SIG\u IGN忽略SIGHUP。 对于
信号主机
,可能会发生许多情况

  • 针对SIGSEGV执行的信号处理程序A: 这将执行
    printf(“SIGSEGV!\n”)仅限
  • 针对SIGSEGV执行的信号处理程序B 这需要绕过流入SIG_-DFL的流,或者像处理SIG_-DFL一样处理它
  • 在linux系统中,定义的信号处理程序只是一个伪引用,如
    #define SIG_DFL((signandler_t)0)
    。我已经知道了直接使用SIG_-IGN、SIG_-DFL或SIG_-ERR的机制。但是,信号处理程序是否必须在某个类中进行组织并作为一个系列执行

    请看下面的代码,它在没有OOP概念的情况下更详细地表达了我的问题

    void my_sigsegv_handler (int signo);
    
    ...
    
    struct sigaction sa_sigsegv;
    sa_sigsegv.sa_handler = my_sigsegv_handler;
    sa_sigsegv.sa_flags = 0;
    
    sigaction(SIGSEGV, &sa_sigsegv, 0);
    
    ...
    
    void my_sigsegv_handler (int signo) {
        ... (handle SIGSEGV as my wish which must be executed) ...
    
        // unfortunately, my code can not handle it correctly...
        // so, I want to perform printing errors into stdin without 
        //    returning back into the flow which has caused errors.
    
        exit(-1);
    }
    
    当然,将SIG_IGN指定到SIGSEGV中并不是我想要的。 只是,这段代码是一个解释我想做的事情的例子


    我真正想知道的问题是,在上述处理程序代码之后,如何实现可以像SIG_DFL、SIG_IGN或SIG_ERR那样工作的处理程序???

    不允许在信号处理程序中做很多事情,包括不允许调用库函数。所以
    printf
    将被排除在外。@Boperson是的,我很清楚你在说什么。确切地说,处理器内部有非常严格的要求。但我问题的重点不是这个。通过结合使用pthread和sigwait,将流转移到严格区域之外,可以克服这个问题。然而,我无法理解如何在自己的处理程序中实现SIG_-IGN或SIG_-DFL。这是我真正想要的。不允许您在信号处理程序中做很多事情,包括不允许调用库函数。所以
    printf
    将被排除在外。@Boperson是的,我很清楚你在说什么。确切地说,处理器内部有非常严格的要求。但我问题的重点不是这个。通过结合使用pthread和sigwait,将流转移到严格区域之外,可以克服这个问题。然而,我无法理解如何在自己的处理程序中实现SIG_-IGN或SIG_-DFL。这是我真正想要的。
    void my_sigsegv_handler (int signo);
    
    ...
    
    struct sigaction sa_sigsegv;
    sa_sigsegv.sa_handler = my_sigsegv_handler;
    sa_sigsegv.sa_flags = 0;
    
    sigaction(SIGSEGV, &sa_sigsegv, 0);
    
    ...
    
    void my_sigsegv_handler (int signo) {
        ... (handle SIGSEGV as my wish which must be executed) ...
    
        // unfortunately, my code can not handle it correctly...
        // so, I want to perform printing errors into stdin without 
        //    returning back into the flow which has caused errors.
    
        exit(-1);
    }