Как заменить STDIN, STDOUT, STDERR в ruby19 - PullRequest
1 голос
/ 15 февраля 2012

В ruby18 я иногда делал следующее, чтобы получить подпроцесс с полным контролем:

stdin, @stdin= IO.pipe
@stdout, stdout= IO.pipe
@stderr, stderr= IO.pipe
@pid= fork do
    @stdin.close
    STDIN.close
    stdin.dup
    @stdout.close
    STDOUT.close
    stdout.dup
    @stderr.close
    STDERR.close
    stderr.dup
    exec(...)
end

Это не работает в ruby19.Метод close для STDIN, STDOUT, STDERR не закрывает основной файловый дескриптор в ruby19.Как мне это сделать в ruby19.

Ответы [ 2 ]

1 голос
/ 08 февраля 2013

Проверьте Process.spawn, Open3 и драгоценный камень childprocess.

Я не могу точно сказать, что вы там пытаетесь сделать, но вы можете контролировать IO дочернего процесса разными способами.

Использование каналов Unix:

readme, writeme = IO.pipe
pid = fork {
    $stdout.reopen writeme
    readme.close
    exec(...)
}

Жонглирование ввода-вывода с помощью Process.spawn:

pid = spawn(command, :err=>:out)

Или завершение процесса в POpen3:

require 'open3'
include Open3
popen3(RUBY, '-r', THIS_FILE, '-e', 'hello("Open3", true)') do
  |stdin, stdout, stderr|
  stdin.write("hello from parent")
  stdin.close_write
  stdout.read.split("\n").each do |line|
    puts "[parent] stdout: #{line}"
  end
  stderr.read.split("\n").each do |line|
    puts "[parent] stderr: #{line}"
  end

Вы также можете рассмотреть Джесси Стоимера Работа с процессами Unix .У него много информации, и его стиль письма очень легко читать и понимать.Книга служит справочным пособием, которое несколько полезнее, чем большая часть фактической документации.


ссылки:

0 голосов
/ 06 марта 2016

В этом сообщении показан один из способов временной замены стандартного ввода в Ruby:

begin 
  save_stdin = $stdin        # a dup by any other name 
  $stdin.reopen('/dev/null') # dup2, essentially 
  # do stuff
ensure 
  $stdin.reopen(save_stdin)  # restore original $stdout 
  save_stdin.close           # and dispose of the copy 
end

Поскольку этот вопрос является одним из самых популярных в Google, для "ruby replace stdin" я надеюсь, что этопоможет другим, ищущим, как это сделать.

...