From: "Ara.T.Howard" Date: 2004-04-28T06:54:04+09:00 Subject: Re: popen issues On Wed, 28 Apr 2004, Hal Fulton wrote: > Here's something I've never figured out. > > Suppose I want real two-way communication with a process via popen. > This seems doable. > > But apparently the read hangs until I do a close_write; and if I > do that, I can't write again. A flush doesn't work. > > Here's what I was thinking (simplified): > > io = IO.popen("/bin/bash","r+") do |f| > f.puts "ls" > puts f.readlines > f.puts "date" > puts f.readlines > end > > I even tried this (following) abomination, to no avail: > > io = IO.popen("/bin/bash","r+") do |f| > writer = f.dup > f.puts "ls\n" > f.close_write > puts f.readlines > w = writer.dup > w.puts "date\n" > w.close_write > puts f.readlines > end > > > Can someone advise? > > > Hal ~/tmp > ls b.rb ~/tmp > cat b.rb require 'session' bash = Session::Bash.new puts '---' cmd = 'ls' p cmd o,e = bash.execute cmd p o p e puts '---' cmd = 'date' p cmd bash.execute(cmd) do |o,e| o and p o e and p e end puts '---' cmd = 'find' bash.errproc = lambda{|e| p e} bash.outproc = lambda{|o| p o} bash.execute cmd ~/tmp > ruby b.rb --- "ls" "b.rb\n" "" --- "date" "Tue Apr 27 15:40:21 MDT 2004\n" --- ".\n" "./b.rb\n" it's horribly more complex than it first appears. read the source to see why (RAA) - you don't know whey the output of one command starts and the next begins - you can't to non-blocking reads from threads - you can't send commands w/o blocking entire processs unless carefull i believe my package is thread safe - as in it doesn't block them, not as in many can use a session at once. at least i using it for many multi-threaded apps. this took my over a week to write - you may want to save the trouble - the source is really straight forward to read. (IMHO) -a -- =============================================================================== | EMAIL :: Ara [dot] T [dot] Howard [at] noaa [dot] gov | PHONE :: 303.497.6469 | ADDRESS :: E/GC2 325 Broadway, Boulder, CO 80305-3328 | URL :: http://www.ngdc.noaa.gov/stp/ | TRY :: for l in ruby perl;do $l -e "print \"\x3a\x2d\x29\x0a\"";done ===============================================================================