Method: Open4.open4

Defined in:
lib/open4.rb

.open4Object

stdin, stdout, stderr, pid

popen4(command);

–}}}



68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
# File 'lib/open4.rb', line 68

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