なひです.そろそろruby-dev?

> From: Takashima, Makoto [mailto:tksmmkt / coral.ocn.ne.jp]
> Sent: Tuesday, October 19, 1999 2:30 AM

> Rubyの実装については詳しくないので単なるUnixのソケット(or
> PIPE)の話として言えば、「送ったつもりになっていたら実はその
> PIPEの先を誰も読んでなかった」場合にはバッファが一杯になるま
> でwrite()は成功して、バッファが一杯になったらBLOCKモードであ
> ればwrite()はブロックし、NON-BLOCKモードであればwrite()は
> EAGAINとかEWOULDBLOCKとかいったエラーで失敗しますので
> SIGPIPE(EPIPE)は関係ないと思います。

はい.この場合SIGPIPEは上がりませんね.

> 誰も読んでいなかったというのが、相手がソケット(or PIPE)を
> close()していたという場合のみSIGPIPE(EPIPE)が発生しますが、
> これは1バイトでもwrite()した瞬間に分かります。

なひもそう思います.で,write syscall中にSIGPIPEが飛んできて,
それをRuby本体が捕まえて,
Error::EPIPEという例外が「メインスレッドに」飛びます.

# でしたよね? 変更されましたっけ? ^^;

結局,[ruby-list:17577]が真であれば何も問題はないのですが,
[ruby-list:17601]だそうなのでちょっと困る,というですよね.
(上記が真なら)メインスレッド以外ではError::EPIPEをrescueできないし,
メインスレッドでもSIGPIPEが飛んでくることがある,と.

> ですから、基本的にSIGPIPEによる処理とEPIPEによる処理に違いは
> ないと思います。

そうできると美しい,というのは理解できます.

--
NaHi, nakahiro, a.k.a. NAKAMURA, Hiroshi
http://www.sarion.com  Sarion Systems Research