In Files

Open4

stolen directly from Open3::open3.rb!

open4.rb: Spawn a program like popen, but with stderr, and pid, 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 "open4"

    stdin, stdout, stderr, pid = Open4.popen4('nroff -man')
or
     include Open4
    stdin, stdout, stderr, pid = popen4('nroff -man')

Public Class Methods

open4(*cmd) click to toggle source
Alias for: popen4
popen4(*cmd) click to toggle source
# File lib/open4.rb, line 18
  def popen4(*cmd)
#--{{{
    pw = IO::pipe   # pipe[0] for read, pipe[1] for write
    pr = IO::pipe
    pe = IO::pipe

    verbose = $VERBOSE
    begin
      $VERBOSE = nil # shut up warning about forking in threads, world writable
                     # dirs, etc
      cid =
        fork{
          # child
          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

          STDOUT.sync = true
          STDERR.sync = true

          exec(*cmd)
        }
    ensure
      $VERBOSE = verbose
    end

    pw[0].close
    pr[1].close
    pe[1].close
    pi = [pw[1], pr[0], pe[0]]
    pw[1].sync = true
    if defined? yield
      begin
        yield(cid, *pi)
        return(Process::waitpid2(cid).last)
      ensure
        pi.each{|p| p.close unless p.closed?}
      end
    end
    [cid, pw[1], pr[0], pe[0]]
#--}}}
  end
Also aliased as: open4

Private Instance Methods

open4(*cmd) click to toggle source
Alias for: popen4
popen4(*cmd) click to toggle source
# File lib/open4.rb, line 18
  def popen4(*cmd)
#--{{{
    pw = IO::pipe   # pipe[0] for read, pipe[1] for write
    pr = IO::pipe
    pe = IO::pipe

    verbose = $VERBOSE
    begin
      $VERBOSE = nil # shut up warning about forking in threads, world writable
                     # dirs, etc
      cid =
        fork{
          # child
          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

          STDOUT.sync = true
          STDERR.sync = true

          exec(*cmd)
        }
    ensure
      $VERBOSE = verbose
    end

    pw[0].close
    pr[1].close
    pe[1].close
    pi = [pw[1], pr[0], pe[0]]
    pw[1].sync = true
    if defined? yield
      begin
        yield(cid, *pi)
        return(Process::waitpid2(cid).last)
      ensure
        pi.each{|p| p.close unless p.closed?}
      end
    end
    [cid, pw[1], pr[0], pe[0]]
#--}}}
  end
Also aliased as: open4

[Validate]

Generated with the Darkfish Rdoc Generator 2.