打开可执行文件并管理其流?

时间:2013-10-07 15:51:32

标签: ruby io stream popen3

为了测试目的,我正在尝试打开一个提示popen3内容的Ruby脚本。

我需要能够键入进程的STDIN并检查输出。到目前为止,我有这个:

require 'open3'
def run(executable, opts = {})
  Signal.trap('CLD') do
    puts 'STDIN:', @stdout.readlines
    # @stderr.rewind
    puts 'STDERR:', @stderr.readlines
    # got EOF, trying to rewind gives me 'Errno::ESPIPE: Illegal seek'

    [@stdin, @stdout, @stderr].each &:close
  end

  @stdin, @stdout, @stderr, @thread = Open3.popen3(executable)
  @status = @thread.value
end

几天来一直在努力,我的大脑正在融化。

1 个答案:

答案 0 :(得分:0)

您在信号处理程序中可以做的事情非常有限。例如,you are not allowed to do I/O in a signal handler。众所周知,信号处理程序容易出错。

您对使用Open3.capture*有何看法?它同时从stdout和stderr读取时避免了所有的块/竞争条件。此外,它允许您传递stdin的数据。使用关键字参数:stdin_data