From: matz@... (Yukihiro Matsumoto) Date: 2002-02-18T14:24:53+09:00 Subject: [ruby-dev:15927] $stdin/out/err への代入 In message "[ruby-dev:15909] 1.6 の寿命 (Re: Re: ERb)" on 02/02/18, Koji Arai writes: |* while の戻り値 こっちは「いつもnil」ということにしましょう。 |* $stdout, $stderr 等への代入 | | 1.6 の挙動が良いのではないかと思います。 せっかくなんで問題をまとめておきましょう。 問題 $stdin, $stdout, $stderrへの代入はCのstdin, stdout, stderrを 取り替える動きが期待されてると思われる。それをどう実現するか。 特に * printfのような内部的にstdioとやりとりをするもの * fork/execしたサブプロセす からのアクセスをどう制御するか 案1 (Ruby1.6) 代入後、$stdin=>0, $stdout=>1, $stderr=>2 にdup2(2)する。た だし、右辺がT_FILEでなければそのまま代入する。 * あらかじめ明示的にdupするなどしなければ、標準のstdinなど を取り返す方法がない 案2 (Ruby 1.7.2) 代入後、 $stdin=>0, $stdout=>1, $stderr=>2 にdup2(2)する。代 入前にsaved_fd配列に元のstdioのfd(0,1,2)をdup(2)して保存して おく。$stdin/out/errの初期値を再代入するとsaved_fdから復旧。 * $stdin = STDINでもとのstdinを取り戻せる 案3 なにもしない。$stdinなどへの代入はRubyの外ではなんの影響もな いということにする。printfなども同様... * さすがに受け入れられないかも。