forkしてexecした先で,標準入出力をパイプに繋ぎ変えるために closeしてdupがruby18では効くのにruby19で効かない。でもreopenは効く。なにそれ。
#!/usr/bin/env ruby
# coding: binary
calc = ["bc", "-l"]
i = IO.pipe # 子プロセスの標準入力とのパイプ
o = IO.pipe # 子プロセスの標準出力とのパイプ
count = 0
if pid=fork
i[0].close; o[1].close # 使わないのでクローズ
Thread.new do # 式入力用スレッド
while exp=STDIN.gets # STDINから読み取った式を
i[1].print exp # bcに送る
end
i[1].close
end
while line=o[0].gets # bcからの出力を得る
printf("%d: %s", count+=1, line)
end
else
i[1].close; o[0].close # 使わないのでクローズ
STDIN.reopen(i[0]) # STDINの置き換え
STDOUT.reopen(o[1]) # STDOUTの置き換え
exec(*calc)
end