From: Yukihiro Matsumoto Date: 2009-06-16T02:41:34+09:00 Subject: [ruby-dev:38645] 1.9でstdin/out/errをcloseしないわけ まつもと ゆきひろです [ruby-core:23853]というレポートが来てて、要するに(ARGF経由 で)STDINを明示的にcloseしてもclosed?が真にならないので1.8と 非互換という話なんですが、ソースを読むとfptr_finalize()中 に if (IS_PREP_STDIO(fptr) || fptr->fd <= 2) { goto check_err; } というコードがあって、どうも意図的に0,1,2はcloseしないように しているみたいなんですが、真意はなんなんでしょうね。 ちょっと考えた範囲だと、「STDINや$stdinなどを置き換えて最初に 割り当てた標準入力オブジェクトがGCされた時に descriptor 0 が 勝手にcloseされては困る」とかのケースなんですが、それなら noraiseをチェックして明示的に呼ばれた時には、やはりcloseすべ きではないかと思えます。その他の理由ってありましたっけ? レポートはさらにcloseを2回した時にclosed streamエラーが出るこ とについての1.9と1.8の非互換の話に続くのですが、これは別のメー ルで。っていうか、なんで1.8はエラーにならないんだ。