IO redirecting; waitpid

T

Thomas Bl.

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
}

Replacing readpartial with sysread also works, and with read_nonblock
works partially.

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 .
 
A

ara.t.howard

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
}

Replacing readpartial with sysread also works, and with read_nonblock
works partially.

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.

a @ http://codeforpeople.com/
 
R

Robert Klemme

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
you can do it, but not on windows.

Well, maybe with cygwin.

Kind regards

robert
 
M

Michal Suchanek

you can do it, but not on windows.

If Ruby on Windows emulates fork (and there is nothing in the docs
saying fork would not work on some platforms) you can use fork and
execute the program normally without popen. The program then inherits
the standard output fd and you do not have to copy the data to it.

For copying data I haven't found a working solution on Linux either.

Thanks

Michal
 
M

Michael Guterl

you can do it, but not on windows.

I seem to see this response a lot with regard to ruby's threading and windows.

I'm typically lucky enough to avoid developing for windows. However,
I am curious if JRuby or 1.9 works around these issues? What about
IronRuby?

I don't mean to hijack, but I feel the original poster could benefit
from answers to these questions also...

Thanks,
Michael Guterl
 
N

Nobuyoshi Nakada

Hi,

At Sat, 16 Aug 2008 22:13:30 +0900,
Thomas Bl. wrote in [ruby-talk:311482]:
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.

What's the exact revision?

It seems not to reproduce with latest 1.8.6 and 1.8.7, but
could with latest 1.8 branch.

Could you report it to the ITS?
<http://redmine.ruby-lang.org/projects/ruby/issues/new>
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,965
Messages
2,570,148
Members
46,710
Latest member
FredricRen

Latest Threads

Top