プロセスからサブプロセスにメッセージを(.putsメソッドを使用して)配置し、(。getsメソッドを使用して)取得するためにIO.popenを使用しようとしています。
私はあまり実験されておらず、質問があります。次のコードがありますが、クローズドストリームに書き込むことができないため、エラーが発生します。
class Interface
def initialize(path)
@sub_process = IO.popen(path, 'w+')
end
def start!
if ok?
@sub_process.puts 'Hello', 'my name is ...'
# and more...
end
end
protected
def ok?
is_ready?(@sub_process) && is_cool?(@sub_process)
end
def is_ready?(sub_process)
reply = process_command(sub_process, 'are u ready?')
reply.chomp.match(/yes_i_am_ready$/)
end
def is_cool?(sub_process)
reply = process_command(sub_process, 'are u cool?')
reply.chomp.match(/yes_i_am_cool$/)
end
def process_command(sub_process, command)
rdr = Thread.new { sub_process.read } # alternative: io.readlines
sub_process.puts "#{command}"
sub_process.close_write
rdr.value # joins and fetches the result
end
end
a = Interface.new("./program")
a.start!
(...) `write':書き込み用に開かれていません(IOError)
ご覧のとおり、このエラーはis_cool?テスト(http://ruby-doc.org/core/classes/IO.html#M002289で説明されています)。
しかし、process_commandメソッドでコメントしようとすると、次の行になります。
# sub_process.close_write
スクリプトがスリープしているようです...無限に:s
閉じた流れを再び開くことはできないと思います。また、プログラム「./program」の他のIO.popenインスタンスを作成することはできません。これは、最初に何らかのコマンド(「準備はできていますか?」や「クールですか?」など)で初期化する必要があるためです。私はそれを使用します(簡単なディスカッションのようにメッセージを送受信することによって)。
この問題を解決するために、現在のコードをどのように変更できますか?
編集:言い換えれば、私はそのような通信を確立したいと思います(与えられたプロトコルに従って):
Parent message: Child answer:
-------------- ------------
'are u ready?' 'yes_i_am_ready'
'are u cool?' 'yes_i_am_cool'
'Hello' 'foo'
'my name is ...' 'bar'
助けてくれてありがとう。