如何在C / C ++中以程序方式实现SIG_IGN或SIG_DFL?

时间:2017-11-15 13:19:41

标签: c++ linux signals

我想将信号处理机制封装到C ++类中,就像WndProc的消息调度到子窗口一样。

class SignalHost : public IRefCount {
private:
    SignalHost() { ... (init) ... }
    ~SignalHost() { ... (restore all signals) ... }

public:
    static SignalHost* getSingleton() {
        static SignalHost _instance;
        return &_instance;
    }

public:
    bool attach(SignalHandler* handler, int signum) { 
        ... (create a list for signal or push newbie) ...
    }
    bool detach(SignalHandler* handler, int signum) { 
        ... (remove the handler from list) ...
    }

public: /* when the signal occured, 
    this will invoke all of attached handlers for that signal. */
};

不幸的是,某些处理程序需要特殊操作,例如SIG_IGN,SIG_DFL或SIG_ERR。例如,nohup使用SIG_IGN忽略SIGHUP。 可以针对SignalHost发生许多案件。

  1. 针对SIGSEGV执行的信号处理程序A: 这只会执行printf("SIGSEGV!\n");
  2. 针对SIGSEGV执行的信号处理程序B. 这个想要绕过流入SIG_DFL或像SIG_DFL一样处理它。
  3. 在Linux系统中,定义的信号处理程序只是一个虚拟引用,如#define SIG_DFL ((sighandler_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一样工作的处理程序?

0 个答案:

没有答案