首页 > 解决方案 > Ruby popen3 - 如何防止重复写入标准输入导致超时?

问题描述

目前,当标准输出为我提供最后一个行标记“EE\n”时,我正在循环写入标准输入。现在它应该一直持续到循环终止,但由于某种原因,stdout 在迭代 625 等处没有提供任何新行,我认为问题在于 stdin 没有监听或捕获新的 put。

我试过用 PTY.spawn 而不是 Open3.popen3 来做,但没有运气。此外,我在期望中设置了一个超时,当这种情况发生时再次写入标准输入。我从这篇文章中得到了保持标准输入打开的想法: ruby popen3 -- 如何在不重新打开进程的情况下重复写入标准输入和读取标准输出?

我需要保持标准输入打开,因为下一步将是标准输出为标准输入等提供新信息。

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。

标签: rubypopen3

解决方案


推荐阅读