linux3/gcc46:“-fnon-call-exceptions”,哪些信号正在捕获指令?
(环境: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
(Environment: gcc/g++ 4.6.1 in -std=gnu++0x mode on Linux 3.0 / x86_64...)
#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;
}
}
By compiling the above with the -fnon-call-exceptions flag, it allows the SIGSEGV signal handler to throw an exception, and when run it will print "success". The documentation of the -fnon-call-exceptions gcc flag reads as follows:
Generate code that allows trapping instructions to throw
exceptions. Note that this requires platform-specific runtime support
that does not exist everywhere. Moreover, it only allows trapping
instructions to throw exceptions, i.e. memory references or floating
point instructions. It does not allow exceptions to be thrown from
arbitrary signal handlers such as SIGALRM.
My question is which of the signals are trapping instructions and which are not?
#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
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
SIGILL、SIGTRAP、SIGBUS、SIGFPE、SIGSEGV、SIGSTKFLT 是最可能的同步信号(即,由于指令尝试执行无效操作而由硬件生成)。
SIGILL, SIGTRAP, SIGBUS, SIGFPE, SIGSEGV, SIGSTKFLT are the most probable synchronous signals (i.e., generated by hardware as consequence of an instruction trying to do something invalid).