Ruby popen3-如何防止重复写入stdin导致超时?

时间:2019-01-10 13:38:02

标签: ruby popen3

当前,当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。

0 个答案:

没有答案