linux3/gcc46:“-fnon-call-exceptions”,哪些信号正在捕获指令?

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)

zvr*_*rba 5

SIGILL、SIGTRAP、SIGBUS、SIGFPE、SIGSEGV、SIGSTKFLT 是最可能的同步信号(即,由于指令尝试执行无效操作而由硬件生成)。