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