为什么我的信号处理程序(抛出exception)不止触发一次?

我正在尝试使用sigaction设置exception处理程序。 它适用于第一个例外。 但是sigaction处理程序在第一个exception之后不会被调用,并且第二个信号发生时程序会突然结束。

#include <iostream> #include <signal.h> #include <exception> #include <string.h> typedef void (*SigactionHandlerPointer)(int iSignal, siginfo_t * psSiginfo, void * psContext); using namespace std; void SigactionHookHandler( int iSignal, siginfo_t * psSiginfo, void * psContext ) { cout << "Signal Handler Exception Caught: std::exception -- signal : " << iSignal << " from SigactionHookHandler()" << endl; throw std::exception(); } class A { public: A() {} virtual ~A() {} virtual void fnct1(); virtual void fnct2() { fnct3(); } virtual void fnct3() { fnct4(); } virtual void fnct4(); }; void A::fnct1() { try { fnct2(); } catch( std::exception &ex ) { cerr << "Signal Handler Exception Caught" << endl; } catch (...) { cerr << "Unknow Exception Caught: " << endl; } } void A::fnct4() { *(int *) 0 = 0; // Access violation } int main() { struct sigaction oNewSigAction; struct sigaction oOldSigAction; memset(&oNewSigAction, 0, sizeof oNewSigAction); oNewSigAction.sa_sigaction = SigactionHookHandler; oNewSigAction.sa_flags = SA_SIGINFO; int iResult = sigaction( SIGSEGV, &oNewSigAction, &oOldSigAction ); cout << "sigaction installed handler with status " << iResult << endl; A * pA = new A(); cout << "Next message expected is : <<Signal Handler Exception Caught: std::exception>> to pass this test" << endl; pA->fnct1(); // Second exception will never be call the sigaction handler. cout << "Next message expected is : <<Signal Handler Exception Caught: std::exception>> to pass this test" << endl; pA->fnct1(); return 0; } 

Solutions Collecting From Web of "为什么我的信号处理程序(抛出exception)不止触发一次?"

信号和例外不相互关联。 使用什么(从异步信号处理程序中抛出异常)只能在少数支持它的编译器之间移植,如GCC和带有-fnon-call-exceptions Intel C / C ++。

也就是说,你忘记的是解除阻塞的信号:当一个信号处理程序正在执行时,同一信号的传递被阻塞,并且当信号处理程序通过异常退出时它不会被解除阻塞。 更改信号处理程序如下所示:

 void SigactionHookHandler( int iSignal, siginfo_t * psSiginfo, void * psContext { cout << "Signal Handler Exception Caught: std::exception -- signal : " << iSignal << " from SigactionHookHandler()" << endl; sigset_t x; sigemptyset (&x); sigaddset(&x, SIGSEGV); sigprocmask(SIG_UNBLOCK, &x, NULL); throw std::exception(); } 

标准C ++没有提到任何关于信号的事情,也没有说明它们是如何与异常交互 你正在尝试做什么将完全特定于你正在使用的操作系统平台,也可能是你编译你的代码的特定编译器。