From: matz@... (Yukihiro Matsumoto) Date: 1998-06-30T18:41:39+09:00 Subject: [ruby-dev:3129] Re: thread and STDIN.gets まつもと ゆきひろです In message "[ruby-dev:3127] Re: thread and STDIN.gets" on 98/06/30, WATANABE Hirofumi writes: |わたなべです. |:以下のスクリプトを実行すると nil と表示されて終了します。 |:バグのように思えるんですけど、違いますか? |:ruby 1.1b9_28 です。 | |cygwin32 版と Linux で試してみたけどちゃんと待ってますね. |HP-UX ですか? うち(linux)では発生しました.原因はITIMER_REALを使って割込み が入るせいです.対応は以下のうちのいずれかです. 1. eval.cの tval.it_interval.tv_sec = 2; /* unblock system calls */ tval.it_interval.tv_usec = 0; tval.it_value = tval.it_interval; setitimer(ITIMER_REAL, &tval, NULL); の部分をはずす.システムコールやライブラリコールでのブロッ クを避けるためのものですが,いろいろややこしいので外した 方が良いかも. 2. io.cに以下のパッチを当てる. io.c側で対応する方法もあります.が,これで完璧と言えない のがこっちを採用するっていえない部分なんですよね. --- io.c 1998/06/26 09:44:25 1.1.1.2.2.41 +++ io.c 1998/06/30 09:36:16 @@ -514,3 +514,6 @@ TRAP_END; - if (c == EOF) break; + if (c == EOF) { + if (errno == EINTR) continue; + break; + } if ((*bp++ = c) == newline) break; @@ -601,3 +604,6 @@ TRAP_END; - if (c == EOF) break; + if (c == EOF) { + if (errno == EINTR) continue; + break; + } if ((*bp++ = c) == '\n') break;