用ctrl c结束程序时调用一个函数

我在Linux环境下工作,我有一个C ++程序,我想要的是当我用CTRL + C取消程序我希望程序执行一个函数,closures一些文件并打印一些副作用,有没有如何做到这一点? 谢谢。

signal()在某些操作系统上可能是危险的,并且在Linux上不推荐使用sigaction() 。 “信号与信号”

下面是我最近碰到的一个例子( “点击中断信号” ),并修改了我正在玩的东西。

 #include<stdio.h> #include<unistd.h> #include<signal.h> #include<string.h> struct sigaction old_action; void sigint_handler(int sig_no) { printf("CTRL-C pressed\n"); sigaction(SIGINT, &old_action, NULL); kill(0, SIGINT); } int main() { struct sigaction action; memset(&action, 0, sizeof(action)); action.sa_handler = &sigint_handler; sigaction(SIGINT, &action, &old_action); pause(); return 0; } 

对于一个完整的工作示例,你可以尝试下面的代码:

 #include <signal.h> #include <stdio.h> volatile bool STOP = false; void sigint_handler(int sig); int main() { signal(SIGINT, sigint_handler); while(true) { if (STOP) { break; } } return 0; } void sigint_handler(int sig) { printf("\nCTRL-C detected\n"); STOP = true; } 

示例运行:

 [user@host]$ ./a.out ^C CTRL-C detected 

你必须赶上SIGINT。 像这样的东西:

 void sigint_handler(int sig) { [do some cleanup] signal(SIGINT, SIG_DFL); kill(getpid(), SIGINT); } 

在这里加载更多细节

简短的回答:看看信号功能,特别是捕捉SIGINT。 您编写回调函数并通过信号函数将其传递给系统,然后在发生特定信号时,系统会调用您的回调函数。 你可以关闭文件,并在那里做任何其他的清理东西。

注意那些可能偶然发现这个问题的人,而是在Windows中寻找答案:

使用SetConsoleCtrlHandler API调用来设置自定义处理程序,并观察CTRL_C_EVENTCTRL_BREAK_EVENTCTRL_CLOSE_EVENT