(Среда: gcc / g ++ 4.6.1 в режиме -std = gnu ++ 0x в 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;
}
}
Путем компиляции выше с помощью -fnon-call-exceptions flag, он позволяет обработчику сигнала SIGSEGV генерировать исключение, и при запуске выдает «success».Документация флага -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