In article <480730C6-A742-42EC-9B1B-1B6583FB4A03 / mva.biglobe.ne.jp>,
  Masatoshi SEKI <m_seki / mva.biglobe.ne.jp> writes:

> selectがwrite可能だと教えてくれたときは、
> PIPE_BUF以下のサイズならwriteできるのですか?

そうとは限りません。

まず、PIPE_BUF は pipe/fifo に atomic に書き込めることが保証される長さ
です。これが select と関連するかというと、規格にはとくに記述が無いよう
に思います。ただ、実装としてそうなっているのは珍しくはないのではないか
と想像しています。でも、そうでは無い環境もあり、例がいくつか
http://cr.yp.to/docs/unixport.html に出ています。

そして、PIPE_BUF は socket とはとくに関係ありません。なので、socket で
ブロックしなくなる保証があるかといえばありません。たとえば、4.4BSD な
ら select で writable とされたときに書き込めることが保証される量は
setsockopt で設定できる SO_SNDLOWAT になり、デフォルトでは 2048 です。
PIPE_BUF は 512 ですが、SO_SNDLOWAT をそれよりも小さく設定することは可
能です。とはいえ、そういう設定をしないデフォルト状態では PIPE_BUF は
SO_SNDLOWAT より小さいので、ブロックしないはずです。もちろん、select
と write の間に他のプロセスが書き込んだ場合は別ですが。

従って、この対処は少なくとも 4.4BSD でのデフォルト状態においては問題を
解決するといえますが、他の OS の状況はまた異なるでしょうし、問題がなく
なったとはいえません。
-- 
[田中 哲][たなか あきら][Tanaka Akira]