# 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

popen3(*cmd) {|| ...}

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]