師星といいます。

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