2009-10-29 14 views
99

どのように私はをキャッチしますか? + CイベントはC++でですか?あなたは(私たちは右のPOSIXを話している?)SIGINT signalをキャッチする必要がありどのようにしてctrl-cイベントを捕捉できますか? (C++)

+0

コンソールアプリケーション、Windowsアプリケーション、または何ですか? – GManNickG

+6

どのOSのWindows、Linuxなど。 – shf301

+1

これはQtアプリケーションですが、開発中にコンソールから実行しています。 (これはLinuxです) – Scott

答えて

133

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;  
} 
+1

my_handlerは引数として 'int s'を取るべきだと思います。 'sig_t'自体が関数ポインタ型です。 –

+23

など - それはCであり、C++ではありません。 C++では、 Abyx

+0

Works on OSXを使用する必要があります。私のmain.mmファイルでは、signal.h、stdlib.h、またはunistd.hも含める必要はありませんでした。私はstdio.hとFoundation/Foundation.hを含めたところですが、シャットダウンメッセージを出力するためにstd :: coutの処理が必要な場合は、iostreamをインクルードしました。 – Volomike

24

はsigactionため

参照@Gab Royer'sの答え。

例:それは実装が異なるよう

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

} 
+0

はい、それはPOSIXです。質問にLinuxを追加するのを忘れてしまった。 – Scott

+2

signal()は、BSDまたはSysVスタイルに従うかどうかによって、動作が異なります。 sigaction()が望ましい – asveikau

+0

はい、そのコードは私にとってはうまくいきませんでした。 sigactionはしました。 – Matt

1

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

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

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

41

、あなたはCTRL +CCTRL +BREAKを処理するためにSetConsoleCtrlHandlerを使用したいです。

例としてhereを参照してください。

関連する問題