1

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

これは ruby​​19 では機能しません。ruby19 では、STDIN、STDOUT、STDERR の close メソッドは、基になるファイル記述子を閉じません。ruby19でこれを行うにはどうすればよいですか。

4

2 に答える 2

1

Process.spawnOpen3、およびchildprocessgemをチェックしてください。

そこで何をしようとしているのか正確にはわかりませんが、多くの方法で子プロセスの IO を制御できます。

Unix パイプの使用:

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

Process.spawnIO を次のようにジャグリングします。

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

また、Jesse Storimer のWorking With Unix Processesも検討してください。情報量が多く、文章も読みやすく、わかりやすい。この本は、実際の多くのドキュメントよりも便利なリファレンス ガイドとしても機能します。


参照:

于 2013-02-08T08:23:01.273 に答える
1

この投稿は、Ruby で標準入力を一時的に置き換える 1 つの方法を示しています。

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

この質問は「ruby replace stdin」のトップ グーグル ヒットの 1 つであるため、これを行う方法を探している他の人に役立つことを願っています。

于 2016-03-06T02:03:54.933 に答える