From: "U.Nakamura" Date: 2008-07-11T14:07:49+09:00 Subject: [ruby-dev:35436] Re: [ruby-cvs:25212] Ruby:r17993 (trunk): * test/ruby/envutil.rb (assert_normal_exit): finish writing script こんにちは、なかむら(う)です。 In message "[ruby-dev:35435] Re: [ruby-cvs:25212] Ruby:r17993 (trunk): * test/ruby/envutil.rb (assert_normal_exit): finish writing script" on Jul.11,2008 13:18:01, wrote: > いままで、windows で (3番以降の) fd が継承されないのは > windows という OS はそういうものだからだと思っていたんですが、 > pipe の変更を見るとよくわからなくなってきました。 > > じつは継承できるんでしょうか? 任意のファイルハンドルを継承できます。 ここであえて「ファイルハンドル」と言っているのは、それがfdで はないからです。 WindowsではUNIXのfdに相当するものはファイルハンドルですが、こ れは0から始まってかつ0〜2に特別な意味がある、というUNIXの常識 を受け継いでいるわけではないので、MicrosoftのCランタイムでは これをラップした形でfdを用意しています。 つまり、Cランタイム上では、fdとファイルハンドルの対応表が存在 するわけです。 さて、子プロセスを生成させる場合、任意のファイルハンドルを継 承させるかさせないかは選べますし、また、それとは別に全てのフ ァイルハンドル(に限らないんですが)を継承させないということも 選ぶことはできます。 しかし、上記の対応表を子プロセスに引き継ぐことは原則としてで きないので、fdを継承することはできない、と言っていいと思いま す。 また、子プロセス側では、fdが継承できないのはもちろん、どのフ ァイルハンドルが親から継承されたのかを知ることはできません。 # ファイルハンドルはfdのように整然とは並んでいない32bitまたは # 64bitの値です。 継承させたファイルハンドルを子プロセスに使用させたい場合、親 プロセスは何らかの方法でそのファイルハンドルの値を子プロセス に知らせる必要があるわけですが、既定の方法は存在しません。 まとめると、 * ファイルハンドルは任意に継承させることができる * 継承させたファイルハンドルを子プロセスに把握させる既定の 方法はない * fdとファイルハンドルの対応はプロセス内で閉じている ということになります。 で、fdの0〜2ですが、これは特別で、各プロセスは自分の標準入力 、標準出力、標準エラー出力のファイルハンドルを取得することが できます(あたりまえですが)。 Cランタイムはこの3つのファイルハンドルに関してはfdの0〜2に割 り当ててくれますので、この3つのファイルハンドル/fdに関しては 上記のまとめに反して継承させたものを子プロセスに使用させるこ とができます。 それでは。 -- U.Nakamura