From: "H.Yamamoto" Date: 2005-08-30T11:31:44+09:00 Subject: [ruby-dev:26913] Re: cannot check EOF of pipe on windows 山本です。 >うー、close_writeの場合もあっち側で閉じる場合もうちでは再現しない... >誰かタスケテー http://msdn.microsoft.com/library/en-us/winsock/winsock/wsaduplicatesocket_2.asp でこんな記述を見つけました。 To assure that all data is sent and received on a connected socket before it is closed, an application should use shutdown to close connection before calling closesocket. For example, to initiate a graceful disconnect: 1. Call WSAAsyncSelect to register for FD_CLOSE notification. 2. Call shutdown with how=SD_SEND. 3. When FD_CLOSE received, call recv until zero returned, or SOCKET_ERROR. 4. Call closesocket. これが原因なら、 IO.popen('ruby', 'r+'){|io| io.write %q{ p 1 print 'xy' } io.close_write sleep 2 while c = io.read(1) p c p io.eof? end } としてしまうと、io.read(1) に到達する前にソケットが閉じてしまうのでデータが失われ、 IO.popen('ruby', 'r+'){|io| io.write %q{ p 1 print 'xy' sleep 2 } io.close_write while c = io.read(1) p c p io.eof? end } とすると、sleep 2 の分ソケットの切断が遅延されるので、たまたま FD_CLOSE が来たとき に read(recv) で巻き取られるという条件が満たされて、うまくいくのではないでしょうか。 # ウィンドウハンドルを必要とするし、select モデルに合いそうもないしで # 確かめてはいないのですが。。。