pipe-fork-exec in Ruby19

forkしてexecした先で,標準入出力をパイプに繋ぎ変えるために closeしてdupがruby18では効くのにruby19で効かない。でもreopenは効く。なにそれ。

pfe.rb

#!/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