是否可以从开放流程中读取最后一行STDOUT?

时间:2014-02-28 21:16:38

标签: ruby io pipe

我使用Stockfish来分析国际象棋的位置,但具体的背景并不重要。我想实时读取程序的输出,而不必等到过程完成。特别是我想阅读最后几行或最后几行。目前我有:

require 'pty'

master, slave = PTY.open
read, write = IO.pipe
pid = spawn("stockfish", :in=>read, :out=>slave)
calculating=0 
slave.close
read.close

write.puts('uci')
write.puts("setoption name Threads value 1")
write.puts("position fen rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR")
write.puts('go infinite')

while calculating<10    
    sleep(1)
    master.each do |line|
        puts line
    end     
    calculating+=1      
end

write.puts('quit')
write.close

puts "done"

这个问题是程序在完成所有10个循环之前没有看到EOF标记,因此它会无限期地卡在master.each行块中。我可以使用master.gets一次一行地阅读下一行,但是如何阅读最后一行呢?

1 个答案:

答案 0 :(得分:0)

我现在有一个有效的解决方案:

fen="rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR"
overseer=fork do
  require 'pty'
  master, slave = PTY.open
  read, write = IO.pipe
  pid = spawn("stockfish", :in=>read, :out=>slave)
  slave.close
  read.close
  write.puts('uci')
  write.puts("setoption name Threads value 4")
  write.puts("position fen #{fen}")
  write.puts('go infinite')

  loop do
   puts master.gets     
  end   

end

if $stdin.gets
  Process.kill("KILL",overseer)
end

这将打印出一个流流,直到用户将其杀死为止。