(环境:Linux 3.0 / x86_64上的-std = gnu ++ 0x模式中的gcc / g ++ 4.6.1 ...)
#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-call-exceptions 标志编译上述内容,它允许 SIGSEGV 信号处理程序抛出异常,并在运行时打印“成功”。 -fnon-call-exceptions 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
答案 0 :(得分:3)
SIGILL,SIGTRAP,SIGBUS,SIGFPE,SIGSEGV,SIGSTKFLT是最可能的同步信号(即,由于指令尝试执行无效操作而由硬件生成)。