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