In Files

  • open3.rb

Methods

Class/Module Index [+]

Quicksearch

Open3

Open3 grants you access to stdin, stdout, and stderr when running another program. Example:

require "open3"
include Open3

stdin, stdout, stderr = popen3('nroff -man')

::popen3 can also take a block which will receive stdin, stdout and stderr as parameters. This ensures stdin, stdout and stderr are closed once the block exits. Example:

require "open3"

Open3.popen3('nroff -man') { |stdin, stdout, stderr| ... }

Public Class Methods

popen3(*cmd) click to toggle source

Open stdin, stdout, and stderr streams and start external executable. Non-block form:

require 'open3'

stdin, stdout, stderr = Open3.popen3(cmd)

Block form:

require 'open3'

Open3.popen3(cmd) { |stdin, stdout, stderr| ... }

The parameter cmd is passed directly to Kernel#exec.

popen3 is like system in that you can pass extra parameters, and the strings won't be mangled by shell expansion.

stdin, stdout, stderr = Open3.popen3('identify', '/weird path/with spaces/and "strange" characters.jpg')
result = stdout.read
 
               # File open3.rb, line 52
def popen3(*cmd)
  pw = IO::pipe   # pipe[0] for read, pipe[1] for write
  pr = IO::pipe
  pe = IO::pipe

  pid = fork{
    # child
    fork{
      # grandchild
      pw[1].close
      STDIN.reopen(pw[0])
      pw[0].close

      pr[0].close
      STDOUT.reopen(pr[1])
      pr[1].close

      pe[0].close
      STDERR.reopen(pe[1])
      pe[1].close

      exec(*cmd)
    }
    exit!(0)
  }

  pw[0].close
  pr[1].close
  pe[1].close
  Process.waitpid(pid)
  pi = [pw[1], pr[0], pe[0]]
  pw[1].sync = true
  if defined? yield
    begin
      return yield(*pi)
    ensure
      pi.each{|p| p.close unless p.closed?}
    end
  end
  pi
end
            

Commenting is here to help enhance the documentation. For example, code samples, or clarification of the documentation.

If you have questions about Ruby or the documentation, please post to one of the Ruby mailing lists. You will get better, faster, help that way.

If you wish to post a correction of the docs, please do so, but also file bug report so that it can be corrected for the next release. Thank you.

If you want to help improve the Ruby documentation, please visit Documenting-ruby.org.

blog comments powered by Disqus