linux3 / gcc46: "-fnon-call-exceptions", какие сигналы являются командами перехвата - PullRequest
4 голосов
/ 10 февраля 2012

(Среда: 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

1 Ответ

3 голосов
/ 10 февраля 2012

SIGILL, SIGTRAP, SIGBUS, SIGFPE, SIGSEGV, SIGSTKFLT являются наиболее вероятными синхронными сигналами (т. Е. Сгенерированными оборудованием как следствие инструкции, пытающейся сделать что-то недопустимое).

...