From: Yukihiro Matsumoto Date: 2008-05-02T16:27:45+09:00 Subject: [ruby-dev:34574] Re: write to broken pipe on Linux まつもと ゆきひろです In message "Re: [ruby-dev:34572] Re: write to broken pipe on Linux" on Fri, 2 May 2008 14:57:23 +0900, Nobuyoshi Nakada writes: |> 名前も気になるのですが、この現象がlinux特有のものかどうかも気 |> になります。いっそ、EPIPEを受けたらcloseとかshutdownとか呼ん |> じゃえばいいんじゃないですかね。それだとlinux固有かどうか考え |> なくてもいいし、引数変えなくていいし。 | |上記リンク先の情報によると、少なくともWindows VistaとMac OS X |10.5では発生しないようです。 まあ、Windowsはともかく、OS X以外のUNIX系OSで発生しないかど うかはかなり気になります。OS Xが大丈夫ならBSD系は大丈夫であ る可能性は高いでしょうが、AIXとかHP-UXとか予想しがたいのもあ るし。 EPIPEやENOTCONNが発生したfdをselectに渡すとふたたびそれらが発 生するべきであると(たとえば)POSIX的に明示されているのであれば、 linux固有のバグと認定して、当面、場当たり的な対応をするとかも ありえるとは思うのですが。 |shutdownでは、EPIPEの代わりにENOTCONNが発生するようになるだけで |その次の書き込みでやはりブロックしてしまうようです。closeにする |とEBADFにはなるのですが、eof?やcloseでも同じくEBADFが発生してし |まうようになります。他のスレッドの有無によって動作が変わってしま |うのもどうかという気もしますが。 はじめに立ち返って考えると、読み出そうとした時にEPIPEが返っ てきてしまったIOに対してどのように対処すべきなんでしょうね。 BROKENPIPEフラグを立てる、というのもあんまり正しい対処のよう には思えないんですが。やはり強制的にcloseして例外かなあ。 |というか、1.9ではすでにblocking regionを使えばselectは必要ないは |ずです。 1.9ではその方向で対応しましょうか。 まつもと ゆきひろ /:|)