信号处理程序返回分段错误:11

时间:2014-03-18 07:37:16

标签: c unix signals

我已经注册了一个打印信号编号的处理程序,然后将原始函数调用到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递归并在整个屏幕上打印字符串。 如何正确运行处理程序中的默认处理程序?

1 个答案:

答案 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);
}