C言語関係掲示板

過去ログ

No.56. Ctrl + C


Ctrl + C や 私のキーボードでは Ctrl + Pause (Break)ってなに?

プログラムが無限ループに落ち込んだときとか強制的に終了できて
結構便利なんですけど。
Ctrl + C に対応したアスキーコードとかあるのでしょうか?


こんばんは、ともじです。

>Ctrl + C や 私のキーボードでは Ctrl + Pause (Break)ってなに?

割込みと言われるものです。
割り込みには、プログラムから行う「ソフトウェア割込み」と、ハードウェアからの要求で
起こる「ハードウェア割込み」とがあります。Ctrl+CやCtrl+Breakはキーボードからの
処理中断要求でハードウェア割込みになります。

>プログラムが無限ループに落ち込んだときとか強制的に終了できて
>結構便利なんですけど。
>Ctrl + C に対応したアスキーコードとかあるのでしょうか?

アスキーコードはありません。8086系のCPUでは、CTRL+Cは割込みの種類を表す
割込みベクタの23Hに割振られています。
Ctrl+C と Ctrl+Break はDOSVマシンでは同じ機能だと思われます。


>割込みと言われるものです。
>割り込みには、プログラムから行う「ソフトウェア割込み」と、ハードウェアからの要求で
>起こる「ハードウェア割込み」とがあります。Ctrl+CやCtrl+Breakはキーボードからの
>処理中断要求でハードウェア割込みになります。

>アスキーコードはありません。8086系のCPUでは、CTRL+Cは割込みの種類を表す
>割込みベクタの23Hに割振られています。
>Ctrl+C と Ctrl+Break はDOSVマシンでは同じ機能だと思われます。

なるほど、勉強になりました。
どうもありがとうございした。
OSやドライバなどのどちらかと言えばハード側の開発には
欠かせそうにない知識ですね。


ども。

ちょっとだけ補足。

>>プログラムが無限ループに落ち込んだときとか強制的に終了できて
>>結構便利なんですけど。
>>Ctrl + C に対応したアスキーコードとかあるのでしょうか?

C言語のレベルでCtrl-Cを捕まえるには、signal()でSIGINTを指定すれば
OKです。で、コールバック関数に行いたい処理を書きます。

ところで、割り込みベクタが23Hとかって8086ではなくMS-DOSの話だった
ような気がしますが、気のせいでしょうか(記憶があいまい)??
# まあ、Cでプログラミングする分にはあんまり関係ないですが。。

では。


こんにちは、補足ありがとうございます。

>C言語のレベルでCtrl-Cを捕まえるには、signal()でSIGINTを指定すれば
>OKです。で、コールバック関数に行いたい処理を書きます。

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
void ctrlc(void);

int main(void)
{
        long    n;

        signal(SIGINT,ctrlc);           /* CTRL+Cの割込み */
        for (n=0; n<=1000000; n++) {
                putchar('.');
        }

        return(0);
}

void ctrlc(void)
{
        printf("つかまえた\n");
        exit(0);
}

こんな感じかしら。

>ところで、割り込みベクタが23Hとかって8086ではなくMS-DOSの話だった
>ような気がしますが、気のせいでしょうか(記憶があいまい)??

MS-DOSは8086系CPUで動くOSですから、同じことですよね。

戻る


「初心者のためのポイント学習C言語」 Last modified:2001.10.7
Copyright(c) 2000-2002 TOMOJI All Rights Reserved