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?
Again, thanks!
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
Sysop: | Keyop |
---|---|
Location: | Huddersfield, West Yorkshire, UK |
Users: | 307 |
Nodes: | 16 (2 / 14) |
Uptime: | 96:56:28 |
Calls: | 6,850 |
Calls today: | 1 |
Files: | 12,352 |
Messages: | 5,414,948 |