From: Alex Nelson Date: 2003-10-01T06:19:12+09:00 Subject: Re: popen3 Here is my class as it currently stands: #!/usr/bin/ruby require "open3" require "timeout" class Controller def initialize(p_program, p_read_timeout = 1.0, p_write_timeout = 1.0) puts "Entering Controller::initialize" if $DEBUG @outMsg = Array.new @errMsg = Array.new @program = p_program @read_timeout = p_read_timeout @write_timeout = p_write_timeout puts "Leaving Controller::intialize" if $DEBUG end def start puts "Entering Controller::start" if $DEBUG @p_in, @p_out, @p_err = Open3.popen3(@program) puts "Leaving Controller::start" if $DEBUG end def getStdOut puts "Entering Controller::getStdOut" if $DEBUG timeout @read_timeout do reads = IO::select([@p_out], nil, nil, @read_timeout) if reads unless reads.empty? puts "Returning gets from stdout for Controller::getStdOut" if $DEBUG return @p_out.gets else puts "Returning nil for Controller::getStdOut" if $DEBUG return nil end else puts "Returning nil for Controller::getStdOut" if $DEBUG return nil end end end def getStdErr puts "Entering Controller::getStdErr" if $DEBUG timeout @read_timeout do reads = IO::select(nil, nil, [@p_err], @read_timeout) if reads unless reads.empty? puts "Returning gets from stderr for Controller::getStdErr" if $DEBUG return @p_err.gets end else puts "Returning nil for Controller::getStdErr" if $DEBUG return nil end end end def putMsg(msg) puts "Entering Controller::putMsg" if $DEBUG timeout @write_timeout do puts "Sending <#{msg}> to #{@program}" writes = IO::select(nil, [@p_in], nil, @write_timeout) if writes @p_in.print(msg) else puts "File object was not ready during select for Controller::putMsg" if $DEBUG end end puts "Leaving Controller::putMsg" if $DEBUG end def waitFor(waitMsg, timeOut = 10) puts "Entering Controller::waitFor" if $DEBUG done = 0 msgList = [] timeout timeOut do while ((msg = getStdOut) && (done == 0)) if msg puts "Msg from nwnserver: <#{msg}>" if (msg =~ /#{waitMsg}/) done = 1 end msgList << msg else puts "No message yet" end end end puts "Returning message list for Controller::waitFor" if $DEBUG return(msgList) end end