class POSIX::Spawn::Child

def exec!

can be called explicitly when creating the Child via `build`.
immediately when a new instance of this object is created, or
Execute command, write input, and read output. This is called
def exec!
  # spawn the process and hook up the pipes
  pid, stdin, stdout, stderr = popen4(@env, *(@argv + [@options]))
  @pid = pid
  # async read from all streams into buffers
  read_and_write(@input, stdin, stdout, stderr, @timeout, @max)
  # grab exit status
  @status = waitpid(pid)
rescue Object
  [stdin, stdout, stderr].each { |fd| fd.close rescue nil }
  if @status.nil?
    if !@pgroup_kill
      ::Process.kill('TERM', pid) rescue nil
    else
      ::Process.kill('-TERM', pid) rescue nil
    end
    @status = waitpid(pid) rescue nil
  end
  raise
ensure
  # let's be absolutely certain these are closed
  [stdin, stdout, stderr].each { |fd| fd.close rescue nil }
end