[#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:41773] Re: [Feature #3513] spawn ..., err: nil

From: Tanaka Akira <akr@...>
Date: 2010-07-01 20:58:35 UTC
List: ruby-dev #41773
2010年7月1日19:09 Shyouhei Urabe <redmine@ruby-lang.org>:
>
> spawnのリダイレクト指定にnilを許すようにしませんか。
> 背景から説明するとサブプロセスの標準エラー出力を黙らせようとして
>
> STDOUT.reopen IO.popen(['lzma', out:STDOUT, err:nil], 'w')
>
> などとしてもうまくいかないというのを経験しました(正解は ..., err: :close)。Rubyで
> はなにもないよという意味でnilを使うことが多いので、nilの指定で閉じるというのは素
> 直な推論ではないかと思います。どうでしょう。

まず、標準エラー出力を黙らせるのに close するのは良い方法ではないでしょう。
close すると、出力が起きたときにエラーになるかもしれません。
また、なにか他のファイルが 2番という fd に割り当てられていたらそこに
出力されてしまうかもしれません。
たとえばデータベースが割り当てられていて、データベースが壊れたりしたら
目も当てられません。

では適切な方法は、というと、err:"/dev/null" などとリダイレクトすることです。
(Unix では)

つまり、ここであげられた用法は、おすすめできるやりかたではなく、
この要望を支持する根拠としては不適切です。
説得力のある提案にするためには、もっとよい用法が必要でしょう。

なお、nil の指定は現在、指定しないのと同等です。
これはこれで Ruby ではよくある解釈であり、素直なものだと思います。
-- 
[田中 哲][たなか あきら][Tanaka Akira]

In This Thread