From: matz@... (Yukihiro Matsumoto) Date: 1999-06-23T12:56:48+09:00 Subject: [ruby-dev:7184] Re: [PATCH] io.c: getc does not set errno? まつもと ゆきひろです In message "[ruby-dev:7172] [PATCH] io.c: getc does not set errno?" on 99/06/22, "NAKAMURA, Hiroshi" writes: |どうやら以下のようなシナリオのようです. | |1. sleepする. |2. poll中にSIGHUPを受信. |3. 一度目のsignal handler処理.通常どおり行われる. |4. signal handlerから帰ってきたところで,poll中のインタラプトということで, | errnoがEINTRにセットされる. |5. 再びsleepする. |6. poll中に二度目のSIGHUPを受信. |7. 二度目のsignal handler処理.上記コードに飛び込み,読む読む. |8. line: 633でgetcがEOFを返す.しかしこのマクロはerrnoをセットしない. | 不幸にしてerrnoはEINTRのまま. |9. line: 636の特例に引っかかってcontinue.延々繰り返す. なるほどねえ。あと、errnoをスレッドローカルにするという手も 考えられますね。が、いずれにしてもこのパッチは採用しましょう。 |さて,ともかく,getcがerrnoを設定しない場合もあるんですよね. |ferrorの時のみEINTR,でいいでしょうか? getc()の割込みに関する挙動って結構未定義な気がします。 まつもと ゆきひろ /:|}