0

我正在尝试打开一个 Ruby 脚本,该脚本会提示输入popen3, 用于测试目的。

我需要能够输入进程的 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

已经尝试了几天,我的大脑正在融化。

4

1 回答 1

0

您可以在信号处理程序中执行的操作非常有限。例如,不允许在信号处理程序中执行 I/O。众所周知,信号处理程序很容易出错。

你觉得使用Open3.capture*什么?同时从 stdout 和 stderr 读取时,它避免了所有块/竞争条件。此外,它还允许您为标准输入传递数据。使用关键字参数:stdin_data

于 2014-11-30T09:29:17.110 回答