In article <20050628225134.710a4ab2.tommy / tmtm.org>, とみたまさひろ <tommy / tmtm.org> writes: > [ruby-dev:26398] のように、コンパイル時に FD_SETSIZE を増加させてみた > ところ、3000 くらいでも正常に動作しました。 ふむ。sys/select.h を見直してみたところ... Solaris って FD_SETSIZE を 増加させた時は select が select_large_fdset を使うように変わるんですね。 これは初めて知りました。 > poll() でなく select() のまま行くとしたら、Ruby の make 時に > FD_SETSIZE をいくつにするかが問題でしょうか。最大の 65536 にすると > fd_set 一つあたり 8KB の領域を食います(標準では 128B)。 メモリについては動的に必要な量を計算して確保すればいいんじゃないでしょ うか。Ruby 1.9 には実装済みですし。 とすれば、あとは select_large_fdset を使うようにすればいいわけで、こん なかんじでしょうか。個人的に試せる環境がないので確認がとれないのがつら いところですが。 Index: configure.in =================================================================== RCS file: /src/ruby/configure.in,v retrieving revision 1.279 diff -u -r1.279 configure.in --- configure.in 12 Jun 2005 16:56:06 -0000 1.279 +++ configure.in 29 Jun 2005 15:31:11 -0000 @@ -492,7 +492,7 @@ getpriority getrlimit setrlimit\ dlopen sigprocmask sigaction _setjmp\ setsid telldir seekdir fchmod mktime timegm cosh sinh tanh\ - setuid setgid daemon \ + setuid setgid daemon select_large_fdset \ _UNW_createContextForSelf) AC_ARG_ENABLE(setreuid, [ --enable-setreuid use setreuid()/setregid() according to need even if obsolete.], Index: eval.c =================================================================== RCS file: /src/ruby/eval.c,v retrieving revision 1.792 diff -u -r1.792 eval.c --- eval.c 28 Jun 2005 13:08:32 -0000 1.792 +++ eval.c 29 Jun 2005 15:31:11 -0000 @@ -179,6 +179,10 @@ #include <sys/select.h> #endif +#ifdef HAVE_SELECT_LARGE_FDSET +#define select select_large_fdset +#endif + #ifdef HAVE_SYS_PARAM_H #include <sys/param.h> #endif まぁ、こういう対処より poll を使うほうがいい、というのはひとつの見識だ とは思います。 -- [田中 哲][たなか あきら][Tanaka Akira]