On 16.08.2008 17:07, ara.t.howard wrote: > On Aug 16, 2008, at 7:13 AM, Thomas Bl. wrote: > >> Hello. >> >> I have two problems. >> >> First: is there an easy way to redirect data from an incoming IO >> stream >> to an outgoing IO stream, in a nonblocking way? For example, can you >> run >> a console program from Ruby program and redirect the program's >> output to >> STDOUT in realtime? I know one solution that works, but is there >> anything better? >> >> Thread::new(IO::popen(COMMAND))\ >> { |srv| >> until srv.eof? >> print srv.readpartial(1024) >> end >> } Yes, use the block form - much safer because streams are properly closed: Thread.new do IO.popen COMMAND do |srv| buffer = "" # more efficient # while srv.readpartial(512, buffer) while srv.read(512, buffer) STDOUT.write(buffer) end end end >> Second problem: when I use the code above, and at the same time the >> main >> thread is waiting on Process.waitpid for some other program (not the >> one >> of which I redirect the output, but some else), then the waiting >> doesn't >> terminate correctly. It waits until the process finishes, and then, >> until there is some data available from the process I'm streaming in >> the >> thread above. And only then the main thread goes on. >> >> I use Windows XP, Ruby 1.8.6. >> >> Here's a blog entry describing the same problem, with no solution: >> http://al2o3-cr.blogspot.com/2008/08/iopopen.html . > > you can do it, but not on windows. Well, maybe with cygwin. Kind regards robert