signalについて
いつもお世話になります。
基本的なことですが、お教えください。
C言語の本に、「signalによる割り込み処理」というプログラムが載っていました。
本の説明では、「UNIXでは、シグナルといったもので、割り込み処理を行うことができます。」と、UNIXの話をしているようです。
私の環境はWindowsですが、かまわずに作って実行してみました。
そのプログラムは以下のとおりです。
#include <stdio.h>
#include <signal.h>
#include <stdlib.h> /* この行は自分で加えた */
void onsig(int sig)
{
printf("Control+C\n");
exit(0);
}
int main(void)
{
signal(SIGINT, onsig);
while(1)
{
puts("a"); /* ★このputsは自分で加えた ★ */
}
return 0;
}
意図したとおりに、コントロール+Cを押すと Control+Cが表示されて終わりました。
さて、私はonsig関数の中の exit(0); を削除してみました。
実行すると、はじめたくさんの a が表示され、
コントロール+Cを押すとControl+Cの表示の後すぐにそのままwhileの中に戻っていき、
たくさんのa が表示されて、
再びコントロール+Cを押すとプログラムが終わってプロンプトが戻ってくることがわかりました。
ここで疑問に思ったのは、1回目のコントロール+C の後にすぐにwhileの中に戻っていくのならば、何回 コントロール+Cを押してもwhileの中に戻っていき、コントロール+Cで終わらせることは出来ないのではないか、ということでした。
なぜ2回目のコントロール+Cで終了するのでしょうか。
VC++6.0でWin32 Console Applicationで作成しています。