在C++中如何捕获Ctrl+C事件?
在C++中如何捕获Ctrl+C事件?
signal
并不是最可靠的方式,因为它在实现中存在差异。我建议使用 sigaction
。Tom的代码现在将如下所示:
#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;
}
int s
作为它的参数。sig_t
本身是一个函数指针类型。 - Matthew Marshallprintf()
不支持异步信号安全,因此不能在信号处理函数中使用。 - P.Psa_mask
和 sa_flags
进行一些解释。 - qed你需要捕获 SIGINT 信号(我们正在讨论 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;
}
void my_handler(sig_t s)
更改为 void my_handler(sig_atomic_t s)
,才能使代码能够编译通过。 - jcmonteiro是的,这是一个与平台相关的问题。
如果您正在POSIX上编写控制台程序,请使用信号API(#include <signal.h>
)。
在WIN32 GUI应用程序中,您应该处理WM_KEYDOWN
消息。