Я написал программу, которая обрабатывает сигнал для исключения с плавающей запятой, и я использую Ubuntu 10.4.Не удается обработать исключение с плавающей запятой (FPE) во второй раз
Вот мой исходный код:
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <setjmp.h>
sigjmp_buf mark;
void GeneralHandler(int signo)
{
switch(signo)
{
case SIGFPE:
printf("\nERROR : Invalid Arithmetic operation.\n");
siglongjmp(mark, signo);
break;
}
exit(signo);
}
int main(void)
{
int i = 0,value = 0, ans = 0;
struct sigaction act;
act.sa_handler = GeneralHandler;
sigaction(SIGFPE, &act, NULL);
for(i = 0; i < 10; i++)
{
if(sigsetjmp(mark, 1)) continue;
printf("Value : ");
scanf("%d" ,&value);
ans = 5/value;
printf("%d/%d = %d\n", 5, value, ans);
}
}
Я использую siglongjmp и sigsetjmp методу для перехода от метода обработчика основного метода в течение цикла.
Он работает нормально в первый раз и отображает ОШИБКА: Неверная арифметическая операция., а затем отображает Исключение с плавающей запятой второй раз, а затем выходит.
выход программы:
Searock @ Searock-рабочий стол: ~/C $ ./signal_continue
Значение: 0
ОШИБКА: операция Invalid арифметика.
Значение: 0
плавающей запятой исключением
Searock @ Searock-рабочий стол: ~/C $
Я не уверен, что случилось в моей программе? Почему он не показывает ОШИБКА: Недействительная арифметическая операция. второй раз? Может ли кто-нибудь указать мне в правильном направлении?
Вы должны проверить возвращаемое значение из 'scanf()' и выйти из цикла, если оно не возвращается 1. –