On Windows, when running "normal" ruby from a command prompt (Windows'
cmd.exe), it blocks on write.
...
The "other"
program itself is working fine - it's a simple echo-clone.
I expect the _other_ program is blocking, because you're not reading its
output. That is, you have:
ruby -------|pipe1|--------> other
<------|pipe2| --------
Ruby is stuffing data into pipe1, but not reading pipe2. Other program reads
from pipe1, and stuffs data into pipe2. The O/S will provide some buffering,
but eventually the other program will block as it can't write any more to
pipe2.
Simple solution is to have a separate Ruby thread for reading pipe2: (Note,
not tested under Windows)
prg = "/bin/cat"
pipe = IO.popen(prg, "r+b")
t = Thread.new do
while line = pipe.gets # or pipe.read(1024)
puts "<< #{line}" # optional
end
pipe.close_read
end
File.open(ARGV[0], "rb") do |file|
pipe.write file.read
end
pipe.close_write
t.join