プログラムを実行し、そのプロセスの標準入力・標準出力・ 標準エラー出力にパイプをつなぎます。
※プロセス作成に fork を利用している為、Windows環境では使用出来ません。代替として 'win32-open3[外部]' が利用出来ます。
nroff を実行してその標準入力に man ページを送り込み処理させる。 nroff プロセスの標準出力から処理結果を受け取る。
require "open3"
stdin, stdout, stderr = *Open3.popen3('nroff -man')
# こちらから書く
Thread.fork {
File.foreach('/usr/man/man1/ruby.1') do |line|
stdin.print line
end
stdin.close # または close_write
}
# こちらから読む
stdout.each do |line|
print line
end
Open3.popen3(cmd)外部プログラム cmd を実行し、そのプロセスの標準入力、 標準出力、標準エラー出力に接続されたパイプを 3 要素の配列で返す。 cmd は execと同じ規則で解釈される。
stdin, stdout, stderr = *Open3.popen3("/usr/bin/nroff -man")
ブロックを指定するとパイプの配列を引数にブロックを実行し、最後に パイプを close する。この場合はブロックの最後の式の結果を返す。
require 'open3'
Open3.popen3("read stdin; echo stdout; echo stderr >&2") {|stdin, stdout, stderr|
stdin.puts "stdin"
stdin.close # または close_write
p stdout.read
p stderr.read
}
#=> "stdout\n"
"stderr\n"
stdin への入力が終わったらできる限り早く close か close_write で閉じるべきです。
[UNIX系OS固有の注意] Open3 で作成した子プロセスは wait(2) しなくてもゾンビになりません。
*1 終了ステータスがほしいひとは、POpen4[外部] を試してみるといいかもしれません。