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

Ctrl+Zで中断されないCプログラムの作り方

プログラミングにおいて、ターミナル上で動作中のプログラムが異常な挙動を示した場合、開発者はキーボード操作によってプログラムを強制的に停止させることができます。プログラムを明示的に中断するには、目的に応じた正しいショートカットキーを把握しておく必要があります。

実行中のコードを終了・中断させるために使われるショートカットキーは、主に次の2種類です。

  • Ctrl+C ― プログラムの実行を停止するために使用します。入出力(I/O)処理が完了した後、実行が中断されます。プロセスに対してSIGINTシグナルが送信され、プロセスは終了します。C言語のsignal()関数のように、このSIGINTシグナルを捕捉(ハンドリング)できる言語もあります。
  • Ctrl+Z ― プログラムの実行を一時停止(サスペンド)するために使用します。プロセスに関連するすべての処理が停止し、実行が中断されます。プロセスにはSIGTSTPシグナルが送信されます。仕組み自体はCtrl+Cと似ていますが、より強力なシグナルとして扱われます。ただし、こちらもハンドリングすることが可能です。

Ctrl+Zを無効化するプログラムの考え方

本記事では、Ctrl+Zによる一時停止を回避できるC言語のコードを紹介します。目標は、プログラムがサスペンドされる代わりに「ctrl+z cannot suspend this code(Ctrl+Zではこのコードを中断できません)」というメッセージを出力することです。

前述のとおり、C言語ではCtrl+Zが発生させるSIGTSTPシグナルを捕捉できます。そこで、このシグナルを受け取ったときの動作を再定義し、プログラムを終了させる代わりにメッセージを表示するように変更します。

このようなシグナル処理には、signal()関数を使用します。

サンプルコード

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

void signalhandler(int sig_num){
    signal(SIGTSTP, signalhandler);
    printf("Cannot execute Ctrl+Z\n");
}

int main(){
    int a = 1;
    signal(SIGTSTP, signalhandler);
    while(a){
    }
    return 0;
}

コードの解説

  • signal(SIGTSTP, signalhandler)により、SIGTSTPシグナルを受信した際に呼び出されるハンドラ関数を登録しています。
  • ハンドラ関数内で再度signal()を呼び出しているのは、システムによってはシグナルハンドラが一度実行されるとデフォルトの動作に戻ってしまうためです。再登録することで、何度Ctrl+Zが押されても確実に捕捉できます。
  • main()関数内のwhile(a)は変数aが常に1であるため無限ループとなり、プログラムは継続して動作します。

実行結果

// 無限ループが続き、Ctrl+Zを押してもプログラムは中断されず
// "Cannot execute Ctrl+Z" というメッセージが表示され続ける

このように、シグナルハンドラを適切に登録することで、通常であればプログラムを一時停止させるCtrl+Zの操作を無効化できます。ただし、実際の開発現場では無限ループから抜け出せなくなるリスクもあるため、デバッグ用途以外での安易な使用には注意が必要です。

  1. Windows 11/10で全画面モード中にタスクバーが消えないときの対処法

    Windows 11やWindows 10で、動画を見ているときやゲームをプレイしているときに、全画面表示なのにタスクバーが画面下に残ったまま消えない——そんな経験はありませんか?せっかくの没入感が損なわれてしまい、ストレスを感じる方も多いはずです。この記事では、全画面モードでタスクバーが非表示にならない問題を解決するための3つの方法を詳しく解説します。 全画面モードでタスクバーが消えないときに試したい3つの対処法 この問題が発生した場合は、以下の方法を順番に試してみてください。 エクスプローラー(Windows Explorer)を再起動する 「デスクトップ モードでタスク バーを自動的に

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

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