シグナルハンドラから戻ってきていない?

先日書いた、setjmpとlongjmpに関してエキスパート C プログラミングにシグナルハンドラから復帰するプログラムがあったのでMinGWにて記載してみました。

#include
#include
#include

jmp_buf buf;

void handler( int s )
{
    if( s == SIGINT ) {
        printf( "now got a SIGINT signal\n" );
    }
    longjmp( buf, 1 );
}

int main()
{
    signal( SIGINT, handler );
    if( printf( "%d\n", setjmp(buf)) ){
        printf( "back in main\n" );
    }else{
        printf( "first time through\n" );
    }

    while(1){
    }
}

結果は下記のとおりになりました。
0
back in main
now got a SIGINT signal


しかし、エキスパート C プログラミングには下記のように書かれていました。
back in main
now got a SIGINT signal
back in main

本と別の内容になったので、if( printf( "%d\n", setjmp(buf)) ){ にprintf文を書いて
実際に戻ってきているのかを確認しましたが戻ってきていないようですね。
仕様が変わったのかMinGWのために動作が違うのか…UNIX環境でシグナルハンドラから復帰してくると書かれているので、UNIX環境を整えて確認しないと駄目かもしれませんね

以上、備忘録のための記録でした。


にほんブログ村 IT技術ブログへ
にほんブログ村
ブログランキング・にほんブログ村へ
にほんブログ村