Hi,

in trying to come up with a test script for
http://blade.nagaokaut.ac.jp/cgi-bin/vframe.rb/ruby/ruby-talk/354265?354184-354451
I noticed a strange effect: the closing of stderr in the child process
is not detected by the parent.  A demo run of the attached scripts
looks like this:

robert@fussel:~$ test_scripts/clnt.rb 10
2010-01-05 12:34:16 +0100 read "1\n"
From server: started
2010-01-05 12:34:17 +0100 read "1\n"
2010-01-05 12:34:18 +0100 read "1\n"
2010-01-05 12:34:19 +0100 read "1\n"
2010-01-05 12:34:20 +0100 read "1\n"
2010-01-05 12:34:21 +0100 read "0\n"
2010-01-05 12:34:22 +0100 read "0\n"
2010-01-05 12:34:23 +0100 read "1\n"
2010-01-05 12:34:24 +0100 read "1\n"
2010-01-05 12:34:25 +0100 read "2\n"
From server: 2010-01-05 12:34:26 +0100      read "Received 0 five
seconds ago.\n"
From server: finished writing
From server: stderr.closed? true
From server: finishing
From server: 2010-01-05 12:34:27 +0100      read "Received 0 five
seconds ago.\n"
^Ctest_scripts/clnt.rb:26:in `each': Interrupt
	from test_scripts/clnt.rb:26:in `block in <main>'
	from /usr/local/lib/ruby19/1.9.1/open3.rb:76:in `popen3'
	from test_scripts/clnt.rb:14:in `<main>'

robert@fussel:~$

You can only stop it by interrupting the process.  IMHO the output
should look like this one where the child indicates termination with a
special message (you will notice message "finished reading" which is
not present in the output above):

robert@fussel:~$ test_scripts/clnt.rb 10 x
2010-01-05 12:34:40 +0100 read "1\n"
From server: started
2010-01-05 12:34:41 +0100 read "2\n"
2010-01-05 12:34:42 +0100 read "2\n"
2010-01-05 12:34:43 +0100 read "1\n"
2010-01-05 12:34:44 +0100 read "0\n"
2010-01-05 12:34:45 +0100 read "2\n"
2010-01-05 12:34:46 +0100 read "2\n"
2010-01-05 12:34:47 +0100 read "1\n"
2010-01-05 12:34:48 +0100 read "1\n"
From server: 2010-01-05 12:34:49 +0100      read "Received 0 five
seconds ago.\n"
2010-01-05 12:34:49 +0100 read "0\n"
2010-01-05 12:34:50 +0100 read "Finish\n"
finished reading
From server: finished writing
From server: stderr.closed? true
From server: finishing
finished notifying
From server: 2010-01-05 12:34:54 +0100      read "Received 0 five
seconds ago.\n"
From server: finished
robert@fussel:~$

Is there something I am missing or is this an issue with handling of
stderr?  It seems that this is _not_ related to handling of pipes in
general or in Open3 since simple.rb clearly demonstrates that closing
stderr is detected by the parent process, which you can see from the
timestamps:

robert@fussel:~$ test_scripts/simple.rb
2010-01-05 13:24:58 +0100: stderr "about to close stderr\n"
2010-01-05 13:24:58 +0100: stderr closed
2010-01-05 13:24:58 +0100: stdout "stderr closed\n"
2010-01-05 13:25:03 +0100: stdout "exiting\n"
2010-01-05 13:25:03 +0100: -------------------
2010-01-05 13:25:03 +0100: stderr "about to close stderr\n"
2010-01-05 13:25:03 +0100: stdout "stderr closed\n"
2010-01-05 13:25:08 +0100: stderr closed
2010-01-05 13:25:08 +0100: stdout "exiting\n"
robert@fussel:~$

With the ruby child process closing of stderr is only detected when
the process exits.

robert@fussel:~$ ruby19 --version
ruby 1.9.1p243 (2009-07-16 revision 24175) [i686-linux]

The same happens with p376 under cygwin 1.7.

Kind regards

robert

-- 
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/
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
KbHuYAc72MEOdvA/hv8A5m/fmQAoAAA=