web-dev-qa-db-ja.com

ctrl-cイベントをキャッチするにはどうすればよいですか?

キャッチする方法 Ctrl+C C++のイベント?

122
Scott

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;    
}
160
Gab Royer

Windowsコンソールアプリの場合、 SetConsoleCtrlHandler を使用して処理します CTRL+C そして CTRL+BREAK

例については here を参照してください。

48
Chris Smith

SIGINTをキャッチする必要があります signal (POSIXについて話しているのですか?)

署名については、@ 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;

}
32
Tom

ええ、これはプラットフォームに依存する質問です。

POSIXでコンソールプログラムを作成している場合は、シグナルAPI(#include <signal.h>)を使用します。

WIN32 GUIアプリケーションでは、WM_KEYDOWNメッセージを処理する必要があります。

1
Joyer