我已经注册了一个打印信号编号的处理程序,然后将原始函数调用到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
递归并在整个屏幕上打印字符串。
如何正确运行处理程序中的默认处理程序?
答案 0 :(得分:0)
在调用orifunc()
之前,您需要检查它是否是特殊处理程序值之一,因为它们不是真正的函数。所以你需要这样做:
if(orifunc != SIG_DFL && orifunc != SIG_IGN && orifunc != SIG_HOLD) {
orifunc(sig);
}
或者您可以放回原始处理程序并将其重新发送给自己:
void func(int sig) {
printf("signal number is %d. \n", sig);
signal(sig, orifunc);
raise(sig);
}