(环境: gcc/g++ 4.6.1在Linux3.0/ -std=gnu++0x模式下.)
#include <stdlib.h>
#include <signal.h>
#include <iostream>
using namespace std;
class SegmentationFault {};
void ThrowSegmentationFault(int)
{
throw SegmentationFault();
}
void ohno(char* x)
{
*x = 42;
}
int main()
{
signal(SIGSEGV, ThrowSegmentationFault);
try
{
ohno(0);
}
catch (const SegmentationFault&)
{
cout << "success" << endl;
}
}通过使用-fnon调用异常标志编译上述代码,它允许SIGSEGV信号处理程序抛出异常,并且在运行时它将打印“成功”。-fnon呼叫例外gcc旗的文档如下:
生成允许捕获指令抛出异常的代码。请注意,这需要特定于平台的运行时支持,而这种支持并不是无处不在的。此外,它只允许捕获指令抛出异常,即内存引用或浮点指令。它不允许从SIGALRM等任意信号处理程序引发异常。
我的问题是,哪些信号是诱捕指令的,哪些不是?
#define SIGHUP 1
#define SIGINT 2
#define SIGQUIT 3
#define SIGILL 4
#define SIGTRAP 5
#define SIGABRT 6
#define SIGIOT 6
#define SIGBUS 7
#define SIGFPE 8
#define SIGKILL 9
#define SIGUSR1 10
#define SIGSEGV 11
#define SIGUSR2 12
#define SIGPIPE 13
#define SIGALRM 14
#define SIGTERM 15
#define SIGSTKFLT 16
#define SIGCHLD 17
#define SIGCONT 18
#define SIGSTOP 19
#define SIGTSTP 20
#define SIGTTIN 21
#define SIGTTOU 22
#define SIGURG 23
#define SIGXCPU 24
#define SIGXFSZ 25
#define SIGVTALRM 26
#define SIGPROF 27
#define SIGWINCH 28
#define SIGIO 29
#define SIGPOLL SIGIO
/*
#define SIGLOST 29
*/
#define SIGPWR 30
#define SIGSYS 31
#define SIGUNUSED 31发布于 2012-02-10 09:31:09
SIGILL、SIGTRAP、SIGBUS、SIGFPE、SIGSEGV、SIGSTKFLT是最有可能的同步信号(即由硬件产生的,因为指令试图做一些无效的事情)。
https://stackoverflow.com/questions/9225415
复制相似问题