C语言中system()内CTRL+C未识别,如何让程序捕获后持续运行?
解决按下Ctrl+C后程序继续运行的问题
嘿,我来帮你搞定这个需求!你之前尝试用system("^C;./a.out")的思路是走偏啦——完全不需要重启程序,只要正确捕获SIGINT信号(就是Ctrl+C触发的信号),覆盖它默认的终止行为就行。
核心原理
当你按下Ctrl+C时,操作系统会给当前进程发送SIGINT信号,它的默认处理逻辑是终止进程。我们要做的就是告诉系统:收到这个信号时,别终止,执行我们自己的处理逻辑(哪怕什么都不做)。
修正后的代码示例(基础版)
#include <stdlib.h> #include <stdio.h> #include <signal.h> #include <unistd.h> // 自定义SIGINT信号处理函数 void sighandle_int(int sign) { // 这里用write而不是printf,因为printf不是异步安全函数,在信号处理中可能出问题 const char msg[] = "你按下了Ctrl+C,程序不会终止哦!\n"; write(STDOUT_FILENO, msg, sizeof(msg)-1); } void acceptCommands() { // 模拟程序持续运行的业务逻辑 int count = 0; while(1) { printf("程序正在运行... 当前计数:%d\n", count++); sleep(1); } } int main(int argc, char **argv) { // 注册SIGINT信号的处理函数 if (signal(SIGINT, sighandle_int) == SIG_ERR) { perror("注册信号处理函数失败"); exit(EXIT_FAILURE); } acceptCommands(); return 0; }
代码说明
- 信号处理函数:
sighandle_int会在收到SIGINT时被调用,这里我们只是打印提示信息,然后函数返回,程序会回到之前的执行流程继续运行,不会终止。 signal函数:用来把SIGINT信号和我们的处理函数绑定,替代默认的终止行为。加上错误处理是为了更健壮,避免注册失败的情况。acceptCommands循环:模拟你的程序持续运行的状态,这样你按下Ctrl+C后能直观看到程序没有终止,还在继续输出。
更推荐的可移植版本(用sigaction)
signal函数在不同操作系统上的行为可能有差异,更标准、可移植性更好的方式是用sigaction函数:
#include <stdlib.h> #include <stdio.h> #include <signal.h> #include <unistd.h> void sighandle_int(int sign) { const char msg[] = "你按下了Ctrl+C,程序不会终止哦!\n"; write(STDOUT_FILENO, msg, sizeof(msg)-1); } void acceptCommands() { int count = 0; while(1) { printf("程序正在运行... 当前计数:%d\n", count++); sleep(1); } } int main(int argc, char **argv) { struct sigaction sa; sa.sa_handler = sighandle_int; sigemptyset(&sa.sa_mask); // 信号处理期间不屏蔽其他信号 sa.sa_flags = 0; // 使用默认行为 if (sigaction(SIGINT, &sa, NULL) == -1) { perror("注册信号处理函数失败"); exit(EXIT_FAILURE); } acceptCommands(); return 0; }
额外小提示
如果不想显示任何提示信息,直接把信号处理函数写成空的就行:
void sighandle_int(int sign) { // 什么都不做,直接返回 return; }
这样按下Ctrl+C后程序没有任何输出,但会继续正常运行。
内容的提问来源于stack exchange,提问作者Davide Ambrosi
相关产品推荐
相关产品推荐

