From: Robert Klemme Date: 2010-01-05T21:28:42+09:00 Subject: closing of the stderr pipe not detected - issue in 1.9.1? --0016e6d99cd713d276047c69fac0 Content-Type: text/plain; charset=ISO-8859-1 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
' from /usr/local/lib/ruby19/1.9.1/open3.rb:76:in `popen3' from test_scripts/clnt.rb:14:in `
' 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/ --0016e6d99cd713d276047c69fac0 Content-Type: application/x-gzip; name="test_scripts.tgz" Content-Disposition: attachment; filename="test_scripts.tgz" Content-Transfer-Encoding: base64 X-Attachment-Id: f_g42nndye0 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 KbHuYAc72MEOdvA/hv8A5m/fmQAoAAA= --0016e6d99cd713d276047c69fac0--