module Open4

def self.propagate_exception(cid, ps_read)

def self.propagate_exception(cid, ps_read)
  e = Marshal.load ps_read
  raise Exception === e ? e : "unknown failure!"
rescue EOFError
  # Child process did not raise exception.

rescue
  # Child process raised exception; wait it in order to avoid a zombie.

  Process.waitpid2 cid
  raise
ensure
  ps_read.close
end