Ruby popen3 - Как предотвратить, чтобы повторная запись в stdin приводила к тайм-ауту?
В настоящее время я пишу в stdin в цикле, когда stdout предоставляет мне маркер последней строки "EE\n". Теперь он должен продолжаться до тех пор, пока цикл не будет прерван, но по какой-то причине stdout не предоставляет никаких новых строк на итерации 625 и т. Д. Я думаю, что проблема в том, что stdin не прослушивает или не захватывает новые путы.
Я пытался сделать это с помощью PTY.spawn вместо Open3.popen3, но не повезло. Также я установил тайм-аут в ожидании и когда это произойдет, чтобы снова написать в stdin. Мне пришла в голову идея оставить stdin открытым из этого поста: ruby popen3 - как многократно писать в stdin и читать stdout без повторного открытия процесса?
Мне нужно держать stdin открытым, потому что следующим шагом будет то, что stdout предоставляет новую информацию для stdin и так далее.
def testen()
Open3.popen3("./pos.tx") do |stdin, stdout, stderr, wait_thr|
stdin.sync = true
stdout.sync = true
stdin.puts "e0"
count = 0
while true
stdout.expect("\n") do |result|
if result[0] == "EE\n"
# sleep(0.1)
count +=1
print count.to_s+"\n"
stdin.puts "e0"
end
end
end
stdin.close
# status = wait_thr.value
stdout_str = stdout.read
print stdout_str
end
end
testen
Таким образом, этот фрагмент кода приводит к окончательному выводу 625, что означает, что там, где 625 успешно stdin.puts "e0"
, Но это должно продолжаться до тех пор, пока какое-либо вмешательство пользователя, например ctrl c
,
Решение
Я не читал из stderr, который привел полный канал, теперь я использую popen2.