首页 > 解决方案 > 使用 SING_DFL 时未恢复 SIGINT 默认行为

问题描述

我正在尝试实现在 ctrl+d(而不是 ctrl+C)上退出的自己的 shell 要做到这一点,我希望我的程序忽略 SIGINT 所以我使用

signal(SIGINT, SIG_IGN);

但我确实希望我在 shell 中运行的程序在 ctrl+c 上退出,所以在每个 fork() 之后,在子进程中,我试图使用恢复默认行为

signal(SIGINT, SIG_DFL);

但不幸的是 SIGING 仍然被忽略。我错过了什么?谢谢你!

编辑:正如评论中提到的问题是 SIGINT 没有到达子进程。如果我理解正确,这是因为 exec 只会重置捕获信号的处理程序,而在我的情况下,我忽略了 sigint。为了解决这个问题,我用我自己的处理程序替换了信号(SIGINT,SIG_IGN),它什么都不做:

void sigint_signal_handler(int signum) {
    printf("testttttt");
}

int register_signal_handling() {
    struct sigaction sigint_action;
    memset(&sigint_action, 0, sizeof(sigint_action));
    sigint_action.sa_handler = sigint_signal_handler;
    return sigaction(SIGINT, &sigint_action, NULL);
}

int main(void) {
     if (register_signal_handling() == -1) {
         perror("signal handler registration error");
      exit(1);
     }
     return 0;
}

现在发生的事情很奇怪 - 当我执行 ctrl+c 时,我看到打印了“testttttt”,但它仍然退出程序。如果更换处理程序,这怎么可能?谢谢

标签: cprocessoperating-systemsigint

解决方案


推荐阅读