In article <20080711050939.531D.C613B076 / garbagecollect.jp>,
  "U.Nakamura" <usa / garbagecollect.jp> writes:

> [ruby-dev:35421]および[ruby-dev:35423]の例で言うと、本来子プ
> ロセスに継承して欲しいのはread側のパイプのハンドルだけなのに、
> write側のパイプのハンドルも継承されてしまうため、親プロセス側
> でwrite側のパイプをcloseしても子プロセス側では依然としてopen
> 状態のままのために実際のcloseが行われず、結果として子プロセス
> 側はずっと次の入力または(永久に行われることのない)closeを待ち
> 続けていた、ということでした。

Unix 上での動作からいうと、なにもしなければ継承されるのは当
り前で spawn で継承されないのは close_others オプションが
(spawn では) デフォルトで有効だからです。

以下のように無効に指定すれば、継承されて、症状が観察できます。

% ./ruby -ve '
i, o = IO.pipe
a=spawn("./ruby", STDIN=>i, :close_others=>false)
o.print "p 1"
o.close
p Process.wait a
'
ruby 1.9.0 (2008-07-10 revision 17986) [i686-linux]
(終わらない)

つまり、継承されるかどうかというのは :close_others オプショ
ンの話だと思うのですが、今回の windows での対処は r18015 の
変更を見ると、pipe の変更のようです。
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=18015

いままで、windows で (3番以降の) fd が継承されないのは
windows という OS はそういうものだからだと思っていたんですが、
pipe の変更を見るとよくわからなくなってきました。

じつは継承できるんでしょうか?
-- 
[田中 哲][たなか あきら][Tanaka Akira]