C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: signalで初回例外発生


(過去ログ 108 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■64444 / inTopicNo.1)  signalで初回例外発生
  
□投稿者/ OROCHI (11回)-(2012/12/03(Mon) 21:16:17)

分類:[C/C++] 

2012/12/03(Mon) 21:17:23 編集(投稿者)
OS windows 7 PRO
開発環境:Visual Studio 2010

こんにちは、現在Ctrl+Cで割込みをかけるプログラムを作りたいと思い、以下のようなものを作成しました
要はループ中にctrl+Cを押したときに関数ctrl_cの中を実行したいというものです
ところが、ループ中にctrl+Cを押すと初回例外が発生し、ctrl_cまでたどりつけません
この原因が分かる方、いらっしゃいますでしょうか?

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <signal.h>
#include <process.h>

void ctrl_c(int signal)		// ctrl+cを押すとこれが呼ばれる
{
	int c;
	printf("break?");
	c=getche();
	if(c=='y' ||c=='Y')
	{
		exit(0);	// yかYを押すと終了。それ以外ならmainループに戻る
	}
}

int _tmain(int argc, _TCHAR* argv[])
{
	while(1)
	{
		if(!signal(SIGINT,ctrl_c))		
		{
			printf("can't set SIGINT\n");
		}
		printf("Hello MS-C\n");
	}
	return 0;
}

引用返信 編集キー/
■64445 / inTopicNo.2)  Re[1]: signalで初回例外発生
□投稿者/ Hongliang (22回)-(2012/12/03(Mon) 21:36:36)
http://msdn.microsoft.com/ja-jp/library/vstudio/xdkz3x12.aspx
にWin32ではSIGINTが無効である旨の記述があります。

代替案として、とりあえずWin32APIのSetConsoleCtrlHandler関数を挙げておきます。
引用返信 編集キー/
■64446 / inTopicNo.3)  Re[2]: signalで初回例外発生
□投稿者/ オショウ (42回)-(2012/12/03(Mon) 22:42:27)
> http://msdn.microsoft.com/ja-jp/library/vstudio/xdkz3x12.aspx
> にWin32ではSIGINTが無効である旨の記述があります。

  VisualStudio 2012 では、ダメみたいですが、2010 では
  正常に動作しましたヨ!

※ 上記URLのVisualStudioのバージョンを、2010 にすると
  使えない由の文言は出ない・・・

※ 因みに・・・

void my_handler(int s){

printf("Caught signal %d\n",s);
exit(1);

}

int _tmain(int argc, _TCHAR* argv[])
{
signal(SIGINT,my_handler);

while(1);

return 0;

}

  こう書きましたが・・・

以上。参考まで
引用返信 編集キー/
■64447 / inTopicNo.4)  Re[1]: signalで初回例外発生
□投稿者/ OROCHI (12回)-(2012/12/03(Mon) 22:59:37)
Hongliang 様
ありがとうございます。SetConsoleCtrlHandlerは使ったことがないので試してみます

オショウ様
ありがとうございます。こちらでも試してみましたが、やはりCtrl+Cを押したときに初回例外でハングするようです

64ビット版OSだと使えないとかいう制限があったりするのでしょうか・・・?
引用返信 編集キー/
■64448 / inTopicNo.5)  Re[2]: signalで初回例外発生
□投稿者/ オショウ (43回)-(2012/12/04(Tue) 00:22:18)
> 64ビット版OSだと使えないとかいう制限があったりするのでしょうか・・・?

  そういうことは最初に書いて!

  で、Win7 Ultimate SP1 32/64bit 両方で実験しました。
  Win32 コンソールアプリとして作成したReleaseモードの実行形式
  プログラムを両OS上で動作させ、Control+C キーで、正常にハン
  ドルされ、signalの機能は動作しました。

以上。参考まで
引用返信 編集キー/
■64449 / inTopicNo.6)  Re[3]: signalで初回例外発生
□投稿者/ 774RR (26回)-(2012/12/04(Tue) 08:33:10)
Win32 では Ctrl-C は Win32 例外 0x40010005 として実装されているので、
「初回例外になること」は正常で、ならないほうがおかしい。

当該プログラムを Visual Studio のデバッガ上で実行させている場合、
Visual Studio の標準設定では 0x40010005 例外をデバッガが横取りする。
そのため期待通りに動作しない*ようにみえている*ものと推測する。

Visual Studio の画面で デバッグ→例外 と進み、
40010005 Ctrl-C のチェックを外す(デバッガによる中断を しない とする)と
もしかしたら期待通りになるかもしれない。

Ctrl-C と Ctrl-Break の例外値は違う。
Ctrl-Break も捕捉したいのであれば SIGBREAK (という値は UN*X には無い) も
対処しておく必要がありそうだ。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -