Сигнал SIGFPE не заканчивается и генерирует основной файл
Согласно предварительной документации по программированию UNIX, сигнал SIGFPE завершает программу и генерирует файл ядра.
Вот моя программа
#include <unistd.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
static void sig_fpe(int signo);
int
main()
{
int pid;
if(signal(SIGFPE, sig_fpe) == SIG_ERR)
printf("Signal error\n");
pid = 10;
pid = pid / 0;
exit(0);
}
static void
sig_fpe(int signo)
{
if(signo == SIGFPE){
printf("SIGFPE signal catch\n");
}
}
Когда я запускаю эту программу на машине linux, она многократно печатает "SIGFPE signal catch" и не завершает работу. Пример вывода
SIGFPE signal catch
SIGFPE signal catch
SIGFPE signal catch
SIGFPE signal catch
SIGFPE signal catch
SIGFPE signal catch
SIGFPE signal catch
SIGFPE signal catch
SIGFPE signal catch
SIGFPE signal catch
SIGFPE signal catch
SIGFPE signal catch
SIGFPE signal catch
SIGFPE signal catch
SIGFPE signal catch
SIGFPE signal catch
SIGFPE signal catch
.
.
.
.
В чем проблема?
1 ответ
Это немного сложно с SIGFPE
, когда SIGFPE
пойман, инструкция будет повторно выполнена, если вы просто вернетесь из обработчика - это очень зависит от платформы, но на странице man для сигнала упоминается неопределенное поведение.
Смотрите здесь: Unix сигнализирует сомнение - о выполнении нижеприведенной программы
Если вам также нужен файл ядра, вам нужно будет переустановить обработчик сигналов по умолчанию, см. Linux: обработка ошибки сегментации и получение дампа памяти и включение файлов ядра (в Unix это делается с помощью ulimit -c ...
)