Ctrl+Cを押しても終了しないCプログラムの作成方法
はじめに
本記事では、Ctrl+Cキーを押しても終了しないC言語プログラムの作成方法を解説します。
通常、Ctrl+Cを押すとキーボード割り込みが発生し、実行中のプロセスは強制終了されます。しかし、C言語のシグナルハンドリングの仕組みを利用すれば、Ctrl+Cが押されたタイミングで独自の処理を実行し、プログラムの動作を継続させることが可能です。
シグナルとは
Ctrl+Cが押されると、SIGINT(割り込みシグナル)が生成されます。C言語では、このシグナルを受け取った際の挙動を自由にカスタマイズできます。主なシグナルとその意味は以下の表の通りです。
| シグナル名 | 説明 |
|---|---|
| SIGABRT | 異常終了を示します |
| SIGFPE | 浮動小数点演算例外を示します |
| SIGILL | 不正な命令を示します |
| SIGINT | プログラムへの対話的な割り込み要求(Ctrl+Cなど)を示します |
| SIGSEGV | 不正なメモリアクセスを示します |
| SIGTERM | プログラムへの終了要求を示します |
シグナルハンドラの実装
シグナルを処理するには、標準Cライブラリのsignal()関数を使用します。以下のコードでは、SIGINTを受け取ったときに呼び出されるハンドラ関数を登録しています。
サンプルコード
#include <stdio.h>
#include <signal.h>
void sigint_handler(int signum) { // SIGINT用ハンドラ
// 次回のSIGINTにも対応できるようハンドラを再登録
signal(SIGINT, sigint_handler);
printf("Cannot be stopped using Ctrl+C \n");
fflush(stdout);
}
main () {
signal(SIGINT, sigint_handler); // ハンドラを登録
while(1) { // 無限ループを生成
}
}コードのポイント
main()内でsignal(SIGINT, sigint_handler)を呼び出し、SIGINT発生時にsigint_handlerが実行されるよう設定しています。while(1)による無限ループでプログラムは常時動作し続けます。- Ctrl+Cが押されるとハンドラ内でメッセージを出力し、自身を再度登録することで、以降のCtrl+Cにも対応できるようにしています。
実行結果
Cannot be stopped using Ctrl+C Cannot be stopped using Ctrl+C
Ctrl+Cを何度押しても、プログラムは終了せずメッセージを表示して実行を継続します。
補足:より堅牢な実装について
上記のsignal()関数は簡便ですが、環境によって動作に差があるため、移植性を重視する場合はPOSIX規格のsigaction()関数を使用することが推奨されています。また、実際にプロセスを終了したい場合はCtrl+Zで一時停止後killコマンドを使うか、ターミナルを閉じる必要があります。
-
Windows 11で応答しないプログラムを一括終了する3つの方法
使用中のプログラムが操作に反応しなくなったら、おそらくクラッシュしています。プログラムの「応答なし」状態は、最もよく発生するソフトウェアトラブルの一つです。応答しなくなったプロセスに対しては、「アプリケーションが応答していません。このプロセスを終了しますか?」というエラーメッセージが表示されます。複数のプロセス(タスク)が同時に応答しなくなることもあります。そんなとき、応答していないすべてのプロセスをまとめて終了できるショートカットがあると非常に便利です。この記事では、Windows 11で応答しないプログラムプロセスをすべて終了するためのショートカットを作成する方法を紹介します。デスクトップ
-
Windowsエラー1083の解決方法|実行可能プログラムがサービスを実装していない場合の対処法
Windowsのサービス管理ツールを使ってサービスを起動しようとしたときに、「エラー1083:このサービスが実行されるように構成されている実行可能プログラムは、このサービスを実装していません(Error 1083: The executable program that this service is configured to run in does not implement the service)」というエラーが表示されることがあります。ほとんどのプログラムは何らかのサービスに依存して動作しているため、対象のサービスがレジストリの対応するキーに正しく登録されていないと、このようなエラー