Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.ruby > #7340

Re: How to flush stdin to popen3 without closing it?

From Petter Gustad <newsmailcomp6@gustad.com>
Newsgroups comp.lang.ruby
Subject Re: How to flush stdin to popen3 without closing it?
Date 2017-02-26 22:46 +0100
Organization 502 You are not allowed to talk
Message-ID <87h93gd3s7.fsf@filestore.home.gustad.com> (permalink)
References <8760jwkiyv.fsf@filestore.home.gustad.com> <ehgid3F3dm4U1@mid.individual.net>

Show all headers | View raw


Robert Klemme <shortcutter@googlemail.com> writes:

> On 26.02.2017 17:36, Petter Gustad wrote:
>>
>> It seems like stdin must be closed for popen3 to send stdin to the
>> sub-process. How can I do something like this:
>>
>>    require 'open3'
>>
>>    stdin, stdout, stderr, wait_thr = Open3.popen3("dc")
>>    stdin.puts "1 2 + p"
>>    stdin.flush # does not not help
>>    stdin.close # without this it will just hang on the read
>>    res = stdout.read
>>    puts "1+2 is #{res}"
>>    #stdin.reopen # is it possible to re-open the stdin somehow?
>>    stdin.puts "#{res} 2 * p"
>>    stdin.close
>>    res = stdout.read
>>    puts "(1+2)*2 is #{res}"
>>    ...
>>
>> Is there a way to flush or re-open stdin? Is there some other variation
>> of popen3 which can be used?
>
> You are missing one important point: stdout.read must block until dc
> closes its output because there is no limit set on the read amount.
> And that will only happen if dc's input has been closed because,
> obviously, dc needs to be able to write results as long as input is
> coming.  If you replace that line with
>
> res = stdout.gets
>
> it will work the way you expect.  You could also use stdout.sync=true
> to avoid to have to use #flush all the time.
>
> http://ruby-doc.org/core-2.4.0/IO.html#method-i-sync-3D

Thanks! Actually I was thinking readline, where I was writing read, and
of course the correct ruby method is gets...

require 'open3'

stdin, stdout, stderr, wait_thr = Open3.popen3("dc")
stdin.puts "1 2 + p"
res = stdout.gets
puts "1+2 is #{res}"
stdin.puts "#{res} 2 * p"
res = stdout.gets
puts "(1+2)*2 is #{res}"

The above results in:

1+2 is 3
(1+2)*2 is 6

Again, thanks!

Best regards
//Petter

-- 
.sig removed by request. 

Back to comp.lang.ruby | Previous | NextPrevious in thread | Next in thread | Find similar


Thread

How to flush stdin to popen3 without closing it? Petter Gustad <newsmailcomp6@gustad.com> - 2017-02-26 17:36 +0100
  Re: How to flush stdin to popen3 without closing it? Robert Klemme <shortcutter@googlemail.com> - 2017-02-26 18:42 +0100
    Re: How to flush stdin to popen3 without closing it? Petter Gustad <newsmailcomp6@gustad.com> - 2017-02-26 22:46 +0100
      Re: How to flush stdin to popen3 without closing it? Robert Klemme <shortcutter@googlemail.com> - 2017-02-26 22:53 +0100

csiph-web