code: func (n *Net) StartProcess() (int, error) {
  	listeners, err := n.activeListeners()
  	if err != nil {
  		return 0, err
  	}
  
  	// Extract the fds from the listeners.
  	files := make([]*os.File, len(listeners))
  	for i, l := range listeners {
  		files[i], err = l.(filer).File()
  		if err != nil {
  			return 0, err
  		}
  		defer files[i].Close()
  	}
  
  	// Use the original binary location. This works with symlinks such that if
  	// the file it points to has been changed we will use the updated symlink.
  	argv0, err := exec.LookPath(os.Args[0])
  	if err != nil {
  		return 0, err
  	}
  
  	// Pass on the environment and replace the old count key with the new one.
  	var env []string
  	for _, v := range os.Environ() {
  		if !strings.HasPrefix(v, envCountKeyPrefix) {
  			env = append(env, v)
  		}
  	}
  	env = append(env, fmt.Sprintf("%s%d", envCountKeyPrefix, len(listeners)))
  
  	allFiles := append([]*os.File{os.Stdin, os.Stdout, os.Stderr}, files...)
  	process, err := os.StartProcess(argv0, os.Args, &os.ProcAttr{
  		Dir:   originalWD,
  		Env:   env,
  		Files: allFiles,
  	})
  	if err != nil {
  		return 0, err
  	}
  	return process.Pid, nil
  }
docs: // StartProcess starts a new process passing it the active listeners. It
  // doesn't fork, but starts a new process using the same environment and
  // arguments as when it was originally started. This allows for a newly
  // deployed binary to be started. It returns the pid of the newly started
  // process when successful.