こんにちは.きたと申します.

最近ふとしたことから IO クラスのオブジェクトが GC で回収される際の挙動
に疑問を持ったので質問させて下さい.
# 以下は ruby 1.6.7 での話です.もし開発版の ruby で挙動が異なるようで
# したらご指摘下さい.

x = open("|ls hoge")
x.read
x.close

とした場合は,open() で生成された pipe が close され,子プロセスもきち
んと wait されるのに対し,

x = open("|ls hoge")
x.read
x = nil
GC.start

のように,GC で回収させると pipe は close されますが,子プロセスは
wait されないようです.

これは私だけの感覚かもしれませんが,open() で生成されたオブジェクトに
付随するリソースは,そのオブジェクトが GC される際に開放されるべきでは
ないかと思います.
が,現在の ruby ではそのような実装になっていないようです.
これは何か理由があるのでしょうか?

# とここまで書いて気付いたのですが,FAQ や 落とし穴に書いてあるように,
# ちゃんと close するなり IO.foreach や IO.readlines を使うのがスジな
# んでしょうねぇ.
# なお,このような質問をさせてもらった経緯は
# http://kitaj.no-ip.com/tdiary/20021117.html#p05
# http://kitaj.no-ip.com/tdiary/20021118.html#p10
# あたりに書いてますので,興味がおありの方はご覧下さい.