我在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_EVENT
, CTRL_BREAK_EVENT
或CTRL_CLOSE_EVENT
。