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
test_scripts.tgz (1.64 KB)
ยทยทยท
--
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/