当前,当stdout为我提供最后一行标记“ EE \ n”时,我正在循环写入stdin。现在它应该继续执行直到循环终止,但由于某种原因stdout在迭代625时不提供任何新行,依此类推,我认为问题出在stdin没有监听或捕获新的puts。
我尝试使用PTY.spawn而不是Open3.popen3来实现,但是没有运气。另外,我在期望中设置了超时,并且在发生这种情况时再次将其写入stdin。我的主意是从此帖子中保持stdin开放: ruby popen3 -- how to repeatedly write to stdin & read stdout without re-opening process?
我需要保持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。