You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

UNIX中SIG_IGN是否有对应反向操作?C程序如何停止忽略SIGINT信号

C语言恢复SIGINT信号处理的实现方法

有两种成熟的实现方案,可根据你的场景选择:

方案1:使用signal函数快速恢复

如果你的场景对可移植性要求不高,直接调用signal将信号处理逻辑重置为默认行为即可:

// 停止忽略SIGINT,恢复系统默认处理(默认行为为终止进程)
signal(SIGINT, SIG_DFL);

完整测试示例:

#include <stdio.h>
#include <signal.h>
#include <unistd.h>

int main() {
    // 忽略SIGINT
    signal(SIGINT, SIG_IGN);
    printf("当前SIGINT已被忽略,按Ctrl+C无效果,5秒后恢复默认处理\n");
    sleep(5);

    // 恢复默认处理
    signal(SIGINT, SIG_DFL);
    printf("SIGINT已恢复默认处理,按Ctrl+C可终止程序\n");
    sleep(5);
    return 0;
}

如果需要恢复到你之前自定义的信号处理函数,需要在设置忽略前先保存原有处理函数:

#include <signal.h>

// 自定义SIGINT处理函数
void custom_sigint_handler(int sig) {
    // 自定义逻辑
}

int main() {
    // 保存原有处理函数
    __sighandler_t old_handler = signal(SIGINT, custom_sigint_handler);
    
    // 某个节点设置为忽略
    signal(SIGINT, SIG_IGN);
    
    // 恢复到之前的自定义处理
    signal(SIGINT, old_handler);
    return 0;
}

方案2:使用sigaction函数(生产环境推荐)

signal函数在不同Unix-like系统下的行为存在差异,可移植性差,POSIX标准推荐使用sigaction实现信号处理,恢复逻辑如下:

#include <stdio.h>
#include <signal.h>
#include <unistd.h>

int main() {
    struct sigaction ign_conf, old_conf;

    // 配置忽略SIGINT,同时保存原有配置
    ign_conf.sa_handler = SIG_IGN;
    sigemptyset(&ign_conf.sa_mask);
    ign_conf.sa_flags = 0;
    sigaction(SIGINT, &ign_conf, &old_conf);

    printf("当前SIGINT已被忽略,5秒后恢复原有处理\n");
    sleep(5);

    // 用之前保存的配置恢复
    sigaction(SIGINT, &old_conf, NULL);
    printf("SIGINT已恢复原有处理逻辑\n");
    sleep(5);
    return 0;
}

注意事项

  • SIG_DFL是系统内置宏,代表信号的默认处理逻辑,SIGINT的默认逻辑为终止当前进程
  • 如果需要恢复到自定义处理逻辑,必须在设置忽略前保存原有处理配置,否则无法回溯
  • 生产环境优先选择sigaction方案,行为确定性和可移植性更强

内容的提问来源于stack exchange,提问作者Juan Gil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 14:06:03