[#41778] [Bug #3515] FreeBSD wrongly raises ECONNRESET on close(2) — Yui NARUSE <redmine@...>

Bug #3515: FreeBSD wrongly raises ECONNRESET on close(2)

12 messages 2010/07/02

[ruby-dev:41786] Re: [Feature #3513] spawn ..., err: nil

From: Tanaka Akira <akr@...>
Date: 2010-07-02 13:31:40 UTC
List: ruby-dev #41786
2010年7月2日13:47 Urabe Shyouhei <shyouhei@ruby-lang.org>:
>
>> まず、標準エラー出力を黙らせるのに 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]

In This Thread