class_docstr: Handles launching, suspending signals, and potentially dealing with terminal issues.
code: def _internal_stop(self):
      if not self._is_running:
          return
  
      os.kill(os.getpid(), signal.SIGUSR1)
      self._signals_reset_event.wait()
      termios.tcsetattr(
          sys.stdin.fileno(), termios.TCSAFLUSH, self.old_termios
      )
  
      try:
          children = psutil.Process(self.popen.pid).children(
              recursive=True
          )
          for c in children:
              c.terminate()
              _, alive = psutil.wait_procs(
                  children, timeout=self._GRACEFUL_SHUTDOWN_TIMEOUT_SEC
              )
              for a in alive:
                  a.kill()
      except psutil.NoSuchProcess:
          pass
      finally:
          self.__class__._STARTED_INSTANCE = None
          self._is_running = False
          self._child_exited_event.set()
  
imports: import atexit
  import abc
  import errno
  import logging
  import os
  import shlex
  import signal
  import subprocess
  import sys
  import termios
  import threading
  import time
  import psutil
  from .._ffi import register_func
  from .None import class_factory
  from .None import transport
  from .transport.file_descriptor import FdTransport
label_desc: Use image node_id 4 for calling the GdbDebugger obj's underlying member method code with example usage: obj._internal_stop() without return types