C++でCtrl+C(SIGINT)イベントをキャッチして処理する方法
キーボードの Ctrl + C は、現在実行中のプロセスに割り込み(中断)を送信するために使われる操作です。この記事では、C++でこのCtrl+Cイベントをプログラム側で捕捉(キャッチ)する方法を解説します。
Ctrl+Cは、C/C++におけるシグナルの一種です。そのため、シグナルハンドリングの仕組みを利用することで捕捉できます。Ctrl+Cに対応するシグナルコードは SIGINT(Signal for Interrupt:割り込みシグナル)で、その値は「2」です。
シグナルの捕捉には signal() 関数を使用します。この関数にシグナルの種類と、シグナルを受信した際に呼び出したいコールバック関数(シグナルハンドラ)のアドレスを渡すことで登録が完了します。
サンプルコード
#include <unistd.h>
#include <iostream>
#include <cstdlib>
#include <signal.h>
using namespace std;
// プロセスにCtrl+C(SIGINT)が送られたときに呼び出される関数を定義
void signal_callback_handler(int signum) {
cout << "Caught signal " << signum << endl;
// プログラムを終了する
exit(signum);
}
int main(){
// シグナルとシグナルハンドラを登録
signal(SIGINT, signal_callback_handler);
while(true){
cout << "Program processing..." << endl;
sleep(1);
}
return EXIT_SUCCESS;
}実行結果
$ g++ test.cpp $ ./a.out Program processing... Program processing... Program processing... Program processing... Program processing... Program processing... ^CCaught signal 2 $
コードのポイント
- signal(SIGINT, handler): 第1引数に捕捉したいシグナル(SIGINT)、第2引数にハンドラ関数へのポインタを指定します。
- シグナルハンドラ: Ctrl+Cが押されると、OSからSIGINT(値は2)がプロセスに送られ、登録済みのハンドラ関数が自動的に呼び出されます。
- exit(signum): ハンドラ内でプログラムを明示的に終了させています。ここで終了しなければ、whileループが継続します。
なお、signal() 関数は動作が環境依存になる場合があるため、より移植性と制御性の高い sigaction() の使用が推奨されることもあります。ただし、簡単なシグナル捕捉であれば上記のように signal() でも十分に機能します。
-
C++プログラムから外部アプリケーション(メモ帳など)を起動する方法
この記事では、C++プログラムを使ってメモ帳(Notepad)などのサードパーティ製アプリケーションを起動する方法を解説します。実装は非常にシンプルで、コマンドプロンプトで使うコマンドをそのままC++から呼び出すだけで実現できます。ポイントとなるのは、標準ライブラリの system() 関数です。この関数の引数にアプリケーション名(コマンド)を文字列として渡すと、OSがそのコマンドを実行し、対応するアプリケーションが起動します。サンプルコード#include <iostream> using namespace std; int main() { cout <<
-
C++プログラミングの始め方:初心者向けステップバイステップガイド
C++プログラミングを学ぼうと決めたものの、何から手をつければよいかわからない——そんな方のために、この記事ではC++学習を始めるための基本的な手順をわかりやすく解説します。コンパイラの導入から、初めてのプログラム作成、コンパイルと実行まで、順を追って見ていきましょう。 ステップ1:C++コンパイラを入手する C++プログラミングを学び始める前に、まず最初に行うべきのがコンパイラの準備です。主要なOSプラットフォーム向けに、高品質な無料のC++コンパイラが複数提供されています。自分の環境に合ったものをダウンロードするか、手軽に試したい場合はtutorialspoint.comのオンラインコンパ