module Mixlib::ShellOut::Unix

def fork_subprocess

def fork_subprocess
  initialize_ipc
  fork do
    # Child processes may themselves fork off children. A common case

    # is when the command is given as a single string (instead of

    # command name plus Array of arguments) and /bin/sh does not

    # support the "ONESHOT" optimization (where sh -c does exec without

    # forking). To support cleaning up all the children, we need to

    # ensure they're in a unique process group.

    #

    # We use setsid here to abandon our controlling tty and get a new session

    # and process group that are set to the pid of the child process.

    Process.setsid
    configure_subprocess_file_descriptors
    set_secondarygroups
    set_group
    set_user
    set_environment
    set_umask
    set_cwd
    begin
      command.kind_of?(Array) ? exec(*command, :close_others=>true) : exec(command, :close_others=>true)
      raise 'forty-two' # Should never get here

    rescue Exception => e
      Marshal.dump(e, process_status_pipe.last)
      process_status_pipe.last.flush
    end
    process_status_pipe.last.close unless (process_status_pipe.last.closed?)
    exit!
  end
end