3

次のコードは機能しますが、リーダーとライターが親プロセスと子プロセスでリソースを共有している場合、そもそもそれらが閉じられているのはなぜですか?

reader, writer = IO.pipe

fork do
  reader.close
  writer.puts "foobar"
end

writer.close
puts reader.read  

私が作成した次のコードのように、書き込み操作の後にリーダーとライターを閉じる必要があると思うので、これは私には意味がありません

reader, writer = IO.pipe                                                        

fork do                                                                         
    writer.puts "foobar"                                                  
    writer.close                                                                
end                                                                             
Process.wait                                                                    
puts reader.read                                                                
reader.close       

なぜうまくいかないのかわかりません。誰でも私にアイデアを与えることができますか?

4

1 に答える 1

3

何が起こっているかは、Stormier、Jesseからの引用です。UNIX プロセスの操作( http://workingwithunixprocesses.com、2012) p. 93:

...リーダーが IO#read を呼び出すと、EOF (別名、ファイルの終わりマーカー [ 2 ]) が表示されるまで、データの読み取りを試行し続けます。これは、読み取りに使用できるデータがこれ以上ないことをリーダーに伝えます。

ライターがまだ開いている限り、リーダーはさらにデータを見る可能性があるため、待機します。読み取り前にライターを閉じると、パイプに EOF が置かれるため、リーダーは初期データを取得した後に読み取りを停止します。ライターを閉じるのをスキップすると、リーダーはブロックされ、無期限に読み取りを試み続けます。

IO (ソケットを含む) を頻繁に使用する場合は、彼の本を読むことを強くお勧めします。

他の質問で述べたように、Ruby を使用して TCP 接続を維持する方法は? . _ IO#flush_ IO#sync=_true

于 2013-05-05T14:56:17.460 に答える