And*_*zos 6 c++ linux gcc glibc g++
(环境: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;
}
}
Run Code Online (Sandbox Code Playgroud)
通过使用-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
Run Code Online (Sandbox Code Playgroud)