From: matz@... (Yukihiro Matsumoto) Date: 1998-03-18T10:48:36+09:00 Subject: [ruby-dev:1848] Re: trap and throw problem まつもと ゆきひろです In message "[ruby-dev:1847] Re: trap and throw problem" on 98/03/18, 石塚圭樹 writes: |けいじゅ@日本ラショナルソフトウェアです. |やはり, linuxのlibc5(?)の問題っぽいですね: |以上のコードで確かめましたが, しっかり再現しました. このコードではlongjmpでmainの先頭に戻るので,bufの領域やpの 値がそのまま残っているからだと思います.rubyのgetsの場合,そ の関数の外側までジャンプしますので,読み込んだ領域が残ってい るのは考えにくいんですが…. 同じ状況を作るためには以下のようなコードが必要だと思います. |前にもいったように, ハンドラ中でthrow/raiseしたらそれまでの入力を捨て |てくれる仕様ならば, この問題は解決すると思いますが... というか,捨ててるつもりなんですけど…. まつもと ゆきひろ /:|) #include #include // jmp_buf env; sigjmp_buf env; void sig() { siglongjmp(env, 1); } foo() { char buf[1024]; char *p; while (1) { signal(SIGINT, sig); printf("in> "); p = buf; for (p = buf; *p = getc(stdin); ++p) { if (*p == '\n') break; } *p = 0; printf("out> %s\n", buf); if (strcmp(buf, ".") == 0) exit(0); } } main() { sigsetjmp(env, 0); //setjmp(env); foo(); }