In article <20050623125927.33401bc8.tommy / tmtm.org>,
  とみたまさひろ <tommy / tmtm.org> writes:

> ええと、「カーネルレベルでは制限がない」という話でしょうか。
>
> でもライブラリ側で制限があるんであれば、結局普通には使うことができない
> ということですよね。

普通というのがどの程度かということによりますが、fd_set を動的に確保する方法は
NetBSD のマニュアルには載っていて、基本的にはそれにそった形です。
(BUGS section なのがなんですが)

そして、そのやりかたについて考えてみると、fd_set の中身が bitmap であ
り、カーネルに FD_SETSIZE の制限がないのであれば動くであろうことが期待
できます。

> select() で FD_SETSIZE 以上のファイル記述子を扱う方法というのが公式に
> 無い以上、あくまでも select() でやろうとしたら、各OS毎の実装に依存した 
> select() の制限を迂回するような仕組みを Ruby 内に実装しないといけなく
> なるような気がするんですが、杞憂でしょうか。

poll に具体的な利点があれば poll を使ったほうがいいとは思います。しか
し、カーネルに FD_SETSIZE の制限があるか、fd_set の中身が bitmap でな
い場合で、現状 poll を使って救える環境が思い当たりません。

poll の利点が具体的にあれば変えたほうがいいと思います。でも、現時点で
見当たらないのであれば、見つかるまで select でいいんじゃないでしょうか。

> poll() がない環境(というのがどういうのかは私は知らないんですが)では、
> そもそも FD_SETSIZE 以上のファイルを作れないように制限しちゃうとかでも
> いいんじゃないでしょうか。SIGSEGV で落ちるよりはマシだと思います。
>
> ・ poll() がある環境:
>    select() ではなく poll() を使う。
>
> ・ poll() がない環境:
>    open/socket/pipe 等で FD_SETSIZE 以上のファイル記述子が生成された場
>    合は、Errno::EMFILE 例外にする。
>
> というような感じではどうでしょう?

環境によって実装を変えるのは、避けられるのであれば避けたほうがいいと思
います。開発者の手元で使用されないコードは壊れたときに気がつくのが遅れ
ますし、問題があったときの再現実験や修正も厄介です。

そのような面倒事は、本当に必要な状況が確認されるまで導入を遅らせたほう
がいいんじゃないでしょうか。
-- 
[田中 哲][たなか あきら][Tanaka Akira]