Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C言語でCtrl+Cを押しても終了しないプログラムを作成する方法


この記事では、Ctrl+Cを押してもプログラムが終了せず、代わりに「Ctrl + C cannot terminate the program」というメッセージを表示するプログラムをC言語で作成する方法を解説します。

解決のカギ:シグナルハンドリング

キーボードからCtrl+Cを入力すると、OSはプロセスに対してSIGINT(割り込みシグナル)を送信し、通常であればプログラムは強制終了されます。

この動作を回避するには、signal()関数を使ってSIGINTシグナルを捕捉(キャッチ)し、独自のハンドラ関数で処理します。これにより、デフォルトの「終了する」という動作を上書きすることができます。

実装例

#include <stdio.h>
#include <signal.h>

void signalHandle(int sig_num) {
    signal(SIGINT, signalHandle);
    printf("\n Ctrl + C cannot terminate the program\n");
    fflush(stdout);
}

int main() {
    signal(SIGINT, signalHandle);
    while (!0)
        ;
    return 0;
}

コードの解説

main()内でsignal(SIGINT, signalHandle)を呼び出すことで、SIGINTシグナルを受け取った際にsignalHandle関数が実行されるように登録しています。

ハンドラ関数の中で再度signal()を呼び出しているのは、環境によってはシグナルハンドラが一度実行されるとデフォルト動作に戻ってしまうためです。再登録しておけば、何度Ctrl+Cを押しても確実にメッセージが表示されます。

また、fflush(stdout)は標準出力のバッファを即座にフラッシュし、メッセージをすぐに画面へ反映させるために使っています。

なお、無限ループはwhile(!0)で記述していますが、可読性を重視するならwhile(1)for(;;)と書くのが一般的です。

実行結果

Ctrl + C cannot terminate the program

このプログラムの実行中にCtrl+Cを何度押しても終了せず、メッセージが表示されるだけです。強制的に停止したい場合は、捕捉不可能なSIGKILLを送るkill -9コマンドなどを使用する必要があります。

  1. Windows 11で応答しないプログラムを一括終了する3つの方法

    使用中のプログラムが操作に反応しなくなったら、おそらくクラッシュしています。プログラムの「応答なし」状態は、最もよく発生するソフトウェアトラブルの一つです。応答しなくなったプロセスに対しては、「アプリケーションが応答していません。このプロセスを終了しますか?」というエラーメッセージが表示されます。複数のプロセス(タスク)が同時に応答しなくなることもあります。そんなとき、応答していないすべてのプロセスをまとめて終了できるショートカットがあると非常に便利です。この記事では、Windows 11で応答しないプログラムプロセスをすべて終了するためのショートカットを作成する方法を紹介します。デスクトップ

  2. Windowsエラー1083の解決方法|実行可能プログラムがサービスを実装していない場合の対処法

    Windowsのサービス管理ツールを使ってサービスを起動しようとしたときに、「エラー1083:このサービスが実行されるように構成されている実行可能プログラムは、このサービスを実装していません(Error 1083: The executable program that this service is configured to run in does not implement the service)」というエラーが表示されることがあります。ほとんどのプログラムは何らかのサービスに依存して動作しているため、対象のサービスがレジストリの対応するキーに正しく登録されていないと、このようなエラー