From: Tanaka Akira Date: 2010-07-02T22:31:40+09:00 Subject: [ruby-dev:41786] Re: [Feature #3513] spawn ..., err: nil 2010年7月2日13:47 Urabe Shyouhei : > >> まず、標準エラー出力を黙らせるのに close するのは良い方法ではないでしょう。 >> close すると、出力が起きたときにエラーになるかもしれません。 >> また、なにか他のファイルが 2番という fd に割り当てられていたらそこに >> 出力されてしまうかもしれません。 >> たとえばデータベースが割り当てられていて、データベースが壊れたりしたら >> 目も当てられません。 > > 任意の状況で常にstderrを閉じよ、という主張に対する反論としては、妥当なものだと > 思います。しかし、私のやりたかったケース(lzma)では上記の心配はありません。 spawn は lzma のためだけにデザインされているわけではありません。 > DBなどを使わない場合でもstderrを閉じるのは悪い行為だと思いますか?だとしたらな > ぜそれはspawnでは可能になっているのですか? どうしてもやりたい状況・人には提供するためです。 しかし、おすすめはしません。 > 私の主張は:closeの位置にnilも受け付けて欲しいというだけですので、stderrを閉じ > ることの是非とは独立した話のはずです。 いいえ。 nil を close の意味にすることは close することを使いやすくします。 それはおすすめしないという意図を弱めます。 そもそも、:close によって今でも可能なのですから、可能・不可能という点では 現状でも問題ないはずです。 したがって、この話は close することを使いやすくしようという提案だと解釈して います。 そして、私は使いやすくすることに対して反対しているのです。 解釈を間違っていますか? もし間違っているとしたら、なぜこの提案をしたんですか? >> では適切な方法は、というと、err:"/dev/null" などとリダイレクトすることです。 >> (Unix では) > > それは移植性がありません。せっかくspawn使ってるのに。 > > さらに背景を説明すると、くだんのスクリプトが動く環境には/dev/nullがありませ > ん。Linuxですがキャラクタデバイスへのアクセスが(cgroupで)禁止されています。 えぇ、残念なことに移植性が無いのは分かっています。 次に考えられる方法は、パイプを新しく作って読み込み側を stderr に割り当てる ことですかね。 書き込み側はすぐ close して。 -- [田中 哲][たなか あきら][Tanaka Akira]