奇妙な動作を見つけたときに、C でのシグナル処理を学ぼうとしました。
x /= y の場合。メイン関数のコンテキストで実行されると、シグナル ハンドラが機能します。しかし、いくつかの関数 (bad_func) ハンドラーで実行された同じものは無視されますが、SIGFPE のシグナルハンドラーは既に設定されています。
Q: _control87 が呼び出されても、SIGFPE がグローバル シグナル ハンドラによって関数に捕捉されなかったのはなぜですか?
(MS VC 2010):
#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
#include <setjmp.h>
#include <float.h>
jmp_buf g_jb_MainFunc;
void hook_zd (int i)
{
printf("Result :%i\n",i);
longjmp(g_jb_MainFunc, 5);
}
void bad_func(void)
{
double x = 0., y = 0.;
puts("hello1");
//abort();
x /= y;
puts("bye1");
}
int main(int argc, char* argv[])
{
double x = 0., y = 0.;
signal(SIGFPE, hook_zd);
signal(SIGABRT, hook_zd);
puts("hello");
_control87(0, _MCW_EM );
int res;
if (! (res = setjmp(g_jb_MainFunc)))
{
//abort();
//x /= y;
bad_func();
} else
{
printf("Jumped here from: %i\n",res);
}
puts("bye");
return 0;
}