Tanaka Akira さんは書きました: > Net::SSH の問題は手元では再現しないので、この問題の状況はよ > くわかりません。 以下で、おそらく同じと思われる現象が起きます。 手元では実行ごとに毎回発生していますが、 もしかすると何度か実行すると〜かもしれません。 ------------------------------------------------------------------------------ th = [] 2.times do th << Thread.new do open("/dev/zero") do |i| loop do r, = IO.select([i], [], [], 0) if r p i.read(1) break end end end end end th.each {|t| t.join } ------------------------------------------------------------------------------ 参考になるかどうかわかりませんがdebug printを入れてみました。 先頭が行番号です。 11249 /* Do the select if needed */ 11250 fprintf(stderr,"%4d) need_select=%d\n",__LINE__,need_select); if (need_select) { 11251 /* Convert delay to a timeval */ ... 11267 n = select(max+1, &readfds, &writefds, &exceptfds, delay_ptr); 11268 fprintf(stderr,"%4d) n=%d\n",__LINE__,n); if (n < 0) { 11269 int e = errno; ... 11361 th_found = th; 11362 fprintf(stderr,"%4d) th_found=%d\n",__LINE__,th); found = 1; 11363 break; ... 11369 th_found = th; 11370 fprintf(stderr,"%4d) th_found=%d\n",__LINE__,th); found = 1; 11371 break; ... 11386 } 11387 fprintf(stderr,"%4d) th=%d th_found=%d\n",__LINE__,th,th_found); if ((th->status == THREAD_RUNNABLE || th == th_found) && th->stk_ptr) { 11388 if (!next || next->priority < th->priority) { 11389 fprintf(stderr,"%4d) next=th\n",__LINE__); next = th; 11390 } 実行結果はこんな感じになります。 (使用したのはruby 1.8.8dev (2009-08-06 revision 24416) [i686-linux]です) 11250) need_select=1 11268) n=1 11370) th_found=142481000 11387) th=142326496 th_found=142481000 11389) next=th 11387) th=142481000 th_found=142481000 11250) need_select=1 11268) n=1 11370) th_found=142490464 11387) th=142481000 th_found=142490464 11389) next=th 11387) th=142326496 th_found=142490464 11387) th=142490464 th_found=142490464 11250) need_select=1 11268) n=1 11370) th_found=142481000 11387) th=142326496 th_found=142481000 11389) next=th 11387) th=142490464 th_found=142481000 11387) th=142481000 th_found=142481000 ... 1.8.7-p35でも現象が発生します。1.8.7-p{72,134}と1.9.0-p0ではすぐに終了します。 -- やまだ