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
相关产品推荐
相关产品推荐

