【发布时间】:2014-11-30 18:32:11
【问题描述】:
我试图了解信号处理的工作原理,因此我决定以另一种方式处理除零。程序应请求输入,直到不发生被零除。但是,我的处理程序在第一次跳转后被忽略,除法由系统处理。为什么会这样?
#include <stdio.h>
#include <signal.h>
#include <setjmp.h>
jmp_buf env;
void handler(int sig) {
printf("Invalid input , try again\n");
longjmp(env , 1);
}
int main() {
signal(SIGFPE , handler);
int x , y;
setjmp(env);
scanf("%d%d" , &x , &y);
printf("%d\n" , x / y);
}
【问题讨论】:
-
您的系统似乎正在使用
signal的旧语义,一旦调用信号,就会将信号处理程序重置为SIG_DFL。如果您只是阅读signal(2)和signal(7)手册页,这种行为就不会让人感到意外,而使用sigaction(2)的解决方案也是如此。 -
@JoachimPileborg - 你应该把它变成一个答案。 TBF 到 OP,信号处理对于新手来说并不明显。
-
阅读signal(7) 和this answer 来回答一个非常相似的问题。