我想将信号处理机制封装到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
发生许多案件。
printf("SIGSEGV!\n");
。#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一样工作的处理程序?