为什么我的信号处理程序(引发异常)不会多次触发?
Why doesn't my signal handler (which throws an exception) trigger more than once?
我正在尝试使用sigaction设置异常处理程序。对于第一个异常,它工作得很好。但是,在第一个异常发生后不调用信号处理程序,并且在第二个信号发生时程序突然结束。
#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;
}
信号和异常之间不相关。你正在使用的(从异步信号处理程序抛出异常)只能在支持它的少数编译器之间移植,例如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++没有说明信号,也没有说明它们如何与异常交互。您要做的事情将完全特定于您正在使用的操作系统平台,并且可能是您编译代码的特定编译器。
相关文章:
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- 有可能在信号处理程序中设置promise吗
- 在信号处理程序中捕获C++未处理的异常并恢复应用程序
- 调试和自由执行中的信号处理
- 通过安装信号处理程序关闭多线程应用程序
- 为什么我的信号处理程序只执行一次?
- GTK C++:找不到信号处理程序 您是否使用 -rdynamic 进行了编译?
- C++ 在信号处理程序后继续执行
- 没有信号处理程序的POSIX定时器的目的是什么?
- 为什么这个信号处理程序不能捕获 SIGHUP 或 SIGQUIT?
- 如何在C++中使用 std::bind 函数作为信号处理程序?
- 在 C++17 中,是否未定义使用无锁原子学保护从信号处理程序传递的数据?
- 如何将信号处理程序添加为方法
- 窗口上信号处理程序的异步安全写入函数
- 使用信号处理程序处理从 FIFO 接收的数据
- gtkmm/glade - 将信号处理程序连接到 MenuShell
- GTK+3 编译错误"找不到信号处理程序",您是否使用 -rdynamic 进行了编译?
- 为什么 SIGSEGV 的信号处理程序没有捕获我的C++抛出异常?
- 为什么我的信号处理程序(引发异常)不会多次触发?