3

Rubyでは、生成された子プロセスの標準入力が、同じプロセスのSTDOUTまたはをキャプチャすることなく端末に接続されるのを防ぐことは可能ですか?STDERR

  • バッククォートと x 文字列 ( `...`%x{...}) は、STDIN をキャプチャするため機能しません。

  • Kernel#systemSTDINが端末に接続されたままになるため、機能しません(これにより、次のような信号が傍受^Cされ、プログラムに到達できなくなります。これは、私が回避しようとしていることです)。

  • Open3STDOUTメソッドが と のいずれかまたは両方STDOUTをキャプチャするため、 は機能しませんSTDERR

それで、私は何を使うべきですか?

4

1 に答える 1

1

それをサポートするプラットフォームを使用している場合は、pipeforkおよびを使用してこれを行うことができexecます。

# create a pipe
read_io, write_io = IO.pipe

child = fork do
  # in child

  # close the write end of the pipe
  write_io.close

  # change our stdin to be the read end of the pipe
  STDIN.reopen(read_io)

  # exec the desired command which will keep the stdin just set
  exec 'the_child_process_command'
end

# in parent

# close read end of pipe
read_io.close

# write what we want to the pipe, it will be sent to childs stdin
write_io.write "this will go to child processes stdin"
write_io.close

Process.wait child
于 2013-08-27T21:01:25.067 に答える