Possible ruby bug involving threads and IO

Hi,

I ran into a problem demonstrated by the following code :

#!/usr/bin/ruby

require 'thread'

Thread::new {
  while true do
    puts "before read MOTD"
    str = IO.read("/etc/motd")
    puts "after read MOTD"

    puts "before read UPTIME"
    str = IO.read("/proc/uptime")
    puts "after read UPTIME"
  end
}

while true do
end

Ruby hangs on IO.read("/proc/uptime").

Note that it works with linux 2.4 (tested : 2.4.27) but not linux 2.6
(tested : 2.6.9)
It only fails with files on the proc filesystem.

Any ideas ?

Thanks,

···

--

Lucas Nussbaum
lucas@lucas-nussbaum.net lnu@gnu.org GPG: 1024D/023B3F4F |
jabber: lucas@linux.ensimag.fr http://www.lucas-nussbaum.net |
fingerprint: 075D 010B 80C3 AC68 BD4F B328 DA19 6237 023B 3F4F |

Excerpts from Lucas Nussbaum's mail of 4 Jan 2005 (EST):

Ruby hangs on IO.read("/proc/uptime").

This is probably the same issue described in:
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/109668
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/110600

The upshot is that certain files in /proc/ seem to hang on a select()
call, which Ruby uses for I/O within threads. You can do an strace and
watch the difference between doing this from within and from without a
Thread.

My workaround was something along the lines of:
  system "cat /proc/#{file} > #{tmpfile}"
  f = File.open tmpfile

I don't know that there's a better solution.

···

--
William <wmorgan-ruby-talk@masanjin.net>

Excerpts from Lucas Nussbaum's mail of 4 Jan 2005 (EST):
> Ruby hangs on IO.read("/proc/uptime").

This is probably the same issue described in:
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/109668
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/110600

true

The upshot is that certain files in /proc/ seem to hang on a select()
call, which Ruby uses for I/O within threads. You can do an strace and
watch the difference between doing this from within and from without a
Thread.

My workaround was something along the lines of:
  system "cat /proc/#{file} > #{tmpfile}"
  f = File.open tmpfile

I don't know that there's a better solution.

IO.popen("/bin/cat /proc/uptime")

But still, that's not very satisfying ...

···

On Wed, Jan 05, 2005 at 08:30:09AM +0900, William Morgan <wmorgan-ruby-talk@masanjin.net> wrote:
--

Lucas Nussbaum
lucas@lucas-nussbaum.net lnu@gnu.org GPG: 1024D/023B3F4F |
jabber: lucas@linux.ensimag.fr http://www.lucas-nussbaum.net |
fingerprint: 075D 010B 80C3 AC68 BD4F B328 DA19 6237 023B 3F4F |