2013-05-05 27 views
3

以下代碼有效,但如果讀寫器在父進程和子進程之間共享資源,爲什麼它們首先關閉?如果IO.pipe的行爲與資源類似,爲什麼需要關閉子進程中的管道?

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  

讀者和作家應該關閉,我不知道爲什麼它不」工作。任何人都可以給我一個想法嗎?

+0

將'read'更改爲'readpartial(10)'(換言之,非阻塞式讀取)並查看會發生什麼。 – Catnapper 2013-05-05 13:19:42

回答

3

發生了什麼,引自Stormier, JesseWorking with UNIX Processeshttp://workingwithunixprocesses.com,2012)p。 93:

...當閱讀器調用IO#讀取它將繼續嘗試讀取數據,直到它看到一個EOF(又名。文件結束標記[2])。這告訴讀者,沒有更多的數據可供閱讀。

只要作者仍然是開放的,讀者可能會看到更多的數據,所以它等待。通過在讀取之前關閉寫入器,將EOF放在管道上,以便讀取器在獲取初始數據後停止讀取。如果你跳過關閉作家,那麼讀者將會阻止並繼續嘗試無限期閱讀。

我強烈建議給他的書一個讀,如果你要與IO(包括套接字)工作很多。

正如您的其他問題表示How to maintain the TCP connection using Ruby?您可以手動強制緩衝用IO#flush沖洗或緩衝區設置爲總是後同步讀/寫,通過設置IO#sync=true

相關問題