如何在C中捕获Ctrl C事件?
signal 不是最可靠的方式,因为它在实现上有所不同 . 我建议使用 sigaction . Tom的代码现在看起来像这样:
signal
sigaction
#include <signal.h> #include <stdlib.h> #include <stdio.h> #include <unistd.h> void my_handler(int s){ printf("Caught signal %d\n",s); exit(1); } int main(int argc,char** argv) { struct sigaction sigIntHandler; sigIntHandler.sa_handler = my_handler; sigemptyset(&sigIntHandler.sa_mask); sigIntHandler.sa_flags = 0; sigaction(SIGINT, &sigIntHandler, NULL); pause(); return 0; }
对于Windows控制台应用程序,您希望使用SetConsoleCtrlHandler来处理CTRL C和CTRL BREAK .
有关示例,请参见here .
你必须赶上SIGINT signal(我们正在谈论POSIX吗?)
请参阅@Gab Royer对sigaction的回答 .
例:
#include <signal.h> #include <stdlib.h> #include <stdio.h> void my_handler(sig_t s){ printf("Caught signal %d\n",s); exit(1); } int main(int argc,char** argv) { signal (SIGINT,my_handler); while(1); return 0; }
是的,这是一个平台相关的问题 .
如果要在POSIX上编写控制台程序,请使用信号API(#include <signal.h>) .
在WIN32 GUI应用程序中,您应该处理WM_KEYDOWN消息 .
4 回答
signal
不是最可靠的方式,因为它在实现上有所不同 . 我建议使用sigaction
. Tom的代码现在看起来像这样:对于Windows控制台应用程序,您希望使用SetConsoleCtrlHandler来处理CTRL C和CTRL BREAK .
有关示例,请参见here .
你必须赶上SIGINT signal(我们正在谈论POSIX吗?)
请参阅@Gab Royer对sigaction的回答 .
例:
是的,这是一个平台相关的问题 .
如果要在POSIX上编写控制台程序,请使用信号API(#include <signal.h>) .
在WIN32 GUI应用程序中,您应该处理WM_KEYDOWN消息 .