我已经注册了一个处理程序,它打印信号号,然后将原始函数调用到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执行之后,它返回了一个“分段错误: 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递归并在整个屏幕上打印字符串。如何正确运行处理程序中的默认处理程序?
发布于 2014-03-18 07:44:51
在调用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);
}https://stackoverflow.com/questions/22473033
复制相似问题