師星といいます。 From: Koji Arai <JCA02266 / nifty.ne.jp> Subject: [ruby-dev:12697] Re: errno on non-blocking flock() by fcntl() Date: Wed, 28 Mar 2001 22:54:52 +0900 > > |そして、error.c の修正は上記とは関係ないのですが、現在のrubyでは > > | EWOULDBLOCK と EAGAIN が同じ値のシステム > > |の場合どちらの例外があがるかはrubyの実装依存になります。 > > | > > |これは利用者が困る場合があるのではないかと思い、 > > |同じ値の errno に対してクラスを1つにし、他はそれを代入した > > |定数にしてみました。 > > > > こっちは皆さんの意見を聞いてからにします。私は > > ま、ちょっと思っただけなので頭の片隅にでも置いて頂ければ良い > です。 私は、新井さんのこの変更に賛成です。 理想は、EAGAINとEWOULDBLOCKが同じ値の場合、whenやrescueの判定では どっちを書いていてもマッチして、かつ p Errno::EWOULDBLOCK => Errno::EAGAIN のようにならないことですが、 クラスオブジェクト(rescueの判定をkind_ofで行う、また、自分の名前を知って いて、名乗ってしまう)を、errnoの値でなく名前に対応させている時点で無理が あり、どちらかをあきらめる必要があるものと思います。 Errno::EAGAIN != Errno::EWOULDBLOCK の場合、プログラムが書かれた通りに動 かない、とも言えるのではないでしょうか? 例えばFreeBSDではNONBLOCKなソケットから読もうとしてブロックする場合、 read(2)のmanにはEAGAINしか書いていませんので、rescue Errno::EAGAIN しか 書かないかも知れませんが、現在のRubyではErrno::EWOULDBLOCKがraiseされる ので、rescueされません。その原因は、結局errno.hをgrepしてみるまでわから ないので、不整合を感じるように思います。 例外処理はチェックの甘い部分だと思うので、不具合が発見されないまま残され る可能性もありそうです。 一方 Errno::EAGAIN == Errno::EWOULDBLOCK では、エラーメッセージを見て混 乱する可能性はありますが、プログラムは意図通りに動きますし、仕様としても まだ納得しやすいと思います。 # いっそのこと実体としては全て Errno::E035 のように値に対応させるという # のも一つの案ですが、デメリットのわりにメリットはあまりないかも。 # (inspectを Errno::E035(EWOULDBLOCK,EAGAIN) のようにする?) > EAGAIN, EWOULDBLOCK が異なる値のシステムもあるわけだから > 移植性の高いスクリプト書く場合、結局 > > rescue Errno::EAGAIN, Errno::EWOULDBLOCK > > のようにしないと行けないことに気が付きました(^^; EWOULDBLOCKが定義されないシステムもある(ありえる)でしょうから、 もうちょっと複雑になりそうです:p -- MOROHOSHI Akihiko