どうすればctrl-cイベントをキャッチできますか?


133

C ++でCtrl+ Cイベントをキャッチするにはどうすればよいですか?


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

7
どのOS Windows、Linuxなど
shf301

1
まあ、それはQtアプリですが、開発中はコンソールから実行しています。(これはLinuxです)
スコット

回答:


172

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

1
my_handlerはint s引数としてとるべきだと思います。 sig_tそれ自体が関数ポインタ型です。
マシューマーシャル

38
<stdlib.h>など-Cであり、C ++ではありません。C ++では、<cstdlib>を使用する必要があります
Abyx

8
printf()async-signal-safeではないため、シグナルハンドラー内では使用できません。
PPの

7
これらの機能はWindowsでは使用できません。
Timmmm、2017年

2
いくつかの説明があると便利だろうsa_maskとはsa_flags
2018年


40

SIGINT シグナルをキャッチする必要があります(私たちはPOSIXを正しく話しているのですか?)

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

}

はい、それはPOSIXです。Linuxを質問に追加するのを忘れました。
スコット

2
signal()の動作は、BSDまたはSysVスタイルに従うかどうかによって異なります。sigaction()が推奨されます。
asveikau 2009年

2
古いことは知っていますが、これはg ++(Ubuntu 7.4.0-1ubuntu1〜18.04.1)でコンパイルできません。に変更する必要がありvoid my_handler(sig_t s)ましたvoid my_handler(sig_atomic_t s)
jcmonteiro

1

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.