I have a program test.rb:

  loop do
    puts "This is a test."
    sleep 0.01
  end

And another program pipe.rb:

  require 'open3'

  Open3.popen3('ruby test.rb') do |pin, pout, perr|
    write_map = { pout => $stdout, perr => $stderr, $stdin => pin }
    loop do
      retval = select([pout, perr, $stdin], nil, [pin, $stdout, $stderr], nil)
      puts "select returned"
      for i in retval[0]
        str = i.read(512)
        write_map[i].write(str)
      end
      for i in retval[2]
        exit(1)
      end
    end
  end

I run it with:

  ruby pipe.rb

The result is that I wait about half a second, get a screenful of data,
wait another half a second, get a screenful of data etc.  I would much
prefer that the data be line-buffered.  The idea is that I would like to
talk to an external process and log that process's data to a file, but
I would like to be able to tail -f that file.

Any ideas?

Paul