Я пытаюсь использовать IO.popen для того, чтобы помещать (с помощью метода .puts) и получать (с помощью метода .gets) сообщения из процесса в его подпроцесс.
Я не очень экспериментировал, и у меня есть вопрос. Имея следующий код, у меня ошибка, потому что невозможно писать в закрытом потоке.
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
Я считаю, что невозможно снова открыть закрытый поток. И я не могу создать другой экземпляр IO.popen моей программы "./program", потому что его нужно инициализировать с помощью какой-то команды (например, "ты готов?" И "Ты классный?") В начале, до Я использую его (отправляя и получая сообщения, как простое обсуждение).
Как можно изменить текущий код для решения этой проблемы?
Редактировать : другими словами, я хотел бы установить такое сообщение (согласно заданному протоколу):
Parent message: Child answer:
-------------- ------------
'are u ready?' 'yes_i_am_ready'
'are u cool?' 'yes_i_am_cool'
'Hello' 'foo'
'my name is ...' 'bar'
Большое спасибо за любую помощь.