Open3 (Module)

In: open3.rb

open3.rb: Spawn a program like popen, but with stderr, too. You might also want to use this if you want to bypass the shell. (By passing multiple args, which IO#popen does not allow)

Usage:

      require "open3"

     stdin, stdout, stderr = Open3.popen3('nroff -man')
 or
      include Open3
     stdin, stdout, stderr = popen3('nroff -man')

Methods

popen3  

Public Instance methods

stdin, stdout, stderr
= popen3(command);

[Source]

# File open3.rb, line 15
  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!
    }

    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

[Validate]