Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何捕获ctrl-c事件? 我如何在C++中捕获Ctrl +C事件? < p>你必须捕获SIGITEN(我们正在谈论POSIX吗?)_C++_Event Handling_Posix_Signals_Sigint - Fatal编程技术网

如何捕获ctrl-c事件? 我如何在C++中捕获Ctrl +C事件? < p>你必须捕获SIGITEN(我们正在谈论POSIX吗?)

如何捕获ctrl-c事件? 我如何在C++中捕获Ctrl +C事件? < p>你必须捕获SIGITEN(我们正在谈论POSIX吗?),c++,event-handling,posix,signals,sigint,C++,Event Handling,Posix,Signals,Sigint,请参阅@Gab Royer的答案以了解行动 例如: #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,m

请参阅@Gab Royer的答案以了解行动

例如:

#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;

}
#包括
#包括
#包括
作废我的处理程序(信号){
printf(“捕获的信号%d\n”,s);
出口(1);
}
int main(int argc,字符**argv)
{
信号(SIGINT,我的处理器);
而(1),;
返回0;
}

信号
不是最可靠的方式,因为它在实现上有所不同。我建议使用
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){
printf(“捕获的信号%d\n”,s);
出口(1);
}
int main(int argc,字符**argv)
{
结构sigaction sigIntHandler;
sigIntHandler.sa_handler=my_handler;
SIGEptySet(&sigIntHandler.sa_mask);
sigIntHandler.sa_标志=0;
sigaction(SIGINT,&sigintmhandler,NULL);
暂停();
返回0;
}

是的,这是一个依赖于平台的问题

如果您正在POSIX上编写控制台程序, 使用信号API(
#include


在WIN32 GUI应用程序中,您应该处理
WM_KEYDOWN
消息。

对于Windows控制台应用程序,您希望使用来处理CTRL+C和CTRL+BREAK


请参阅以获取示例。

控制台应用程序、windows应用程序或什么?哪个操作系统是windows、Linux等。这是一个Qt应用程序,但我在开发过程中从控制台运行它。(这是Linux)是的,它是POSIX。我忘了在问题中添加Linux。signal()的行为不同,这取决于它是遵循BSD还是SysV风格。sigaction()更可取。我知道它很旧,但它不是用g++(Ubuntu 7.4.0-1ubuntu1~18.04.1)7.4.0编译的。我必须将
void my_handler(sig_t s)
更改为
void my_handler(sig_atomic_t s)
。我认为我的_handler应该将
int s
作为参数<代码> SIGIt本身是一个函数指针类型,等等。它是C,不是C++。在C++中,你应该使用<代码> Primff()/Script >不是异步信号安全,所以不能在信号处理程序中使用。这些函数在Windows上不可用。