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

标签 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 并在整个屏幕上打印字符串。 如何在我的处理程序中正确运行默认处理程序?

最佳答案

在调用 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/

相关文章:

Java将unix时间戳转换为错误的时间

linux - 如何在 Linux 中选择处理器?

linux - 需要帮助在 shell 中获得两个数字之间的差距

c - 如何在C中忽略信号?

c++ - Windows 上信号处理程序的异步安全写入函数

c - 'while loop' 内存在 C 编程中如何工作?

c++ - JAVA(AES/CBC/PKCS5PADDING)对应的C/C++是什么

Matlab 30 Khz 仍然可以听到

c - 在 STM32H7 上使用执行跟踪片上缓冲区 (ETB)

c - 打乱 5 元素数组以每次获得单独的顺序 C