我已经注册了一个打印信号编号的处理程序,然后将原始函数调用到 SIGINT
。
#include <stdio.h>
#include <signal.h>
void (*orifunc)(int);
void func(int sig) {
printf("signal number is %d. \n", sig);
orifunc(sig);
return;
}
int main() {
orifunc = signal(SIGINT, func);
while (1);
return 0;
}
但是当我运行时,在 printf
执行后,它返回了“Segmentation fault: 11”。
为什么会这样?
因为 SIG_DFL
不是一个真正的函数。我尝试这样编码:
#include <stdio.h>
#include <signal.h>
void func(int sig) {
printf("signal number is %d. \n", sig);
signal(SIGINT, SIG_DFL);
raise(sig);
signal(SIGINT, func);
return;
}
int main() {
signal(SIGINT, func);
while (1);
return 0;
}
然后它递归运行 func
并在整个屏幕上打印字符串。
如何在我的处理程序中正确运行默认处理程序?
最佳答案
在调用 orifunc()
之前,您需要检查它是否是特殊处理程序值之一,因为它们不是真正的函数。所以你需要做:
if(orifunc != SIG_DFL && orifunc != SIG_IGN && orifunc != SIG_HOLD) {
orifunc(sig);
}
或者你可以放回原来的handler,重新发送给自己:
void func(int sig) {
printf("signal number is %d. \n", sig);
signal(sig, orifunc);
raise(sig);
}
关于c - 信号处理程序返回段错误 :11,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22473033/