code: def signal_handler(self, sig, frame):
      org_handler = self._org_handlers.get(sig)
      if not org_handler:
          return signal.SIG_DFL
  
      self.signal = sig
      signal.signal(sig, org_handler or signal.SIG_DFL)
  
      # if this is a sig term, we wait until __at_exit is called (basically do nothing)
      if sig == signal.SIGINT:
          # return original handler result
          return (
              org_handler
              if not callable(org_handler)
              else org_handler(sig, frame)
          )
  
      if self._signal_recursion_protection_flag:
          # call original
          os.kill(os.getpid(), sig)
          return (
              org_handler
              if not callable(org_handler)
              else org_handler(sig, frame)
          )
  
      self._signal_recursion_protection_flag = True
  
      # call exit callback
      if self._exit_callback:
          # noinspection PyBroadException
          try:
              self._exit_callback()
          except Exception:
              pass
  
      # remove stdout logger, just in case
      # noinspection PyBroadException
      try:
          # noinspection PyProtectedMember
          Logger._remove_std_logger()
      except Exception:
          pass
  
      # noinspection PyUnresolvedReferences
      os.kill(os.getpid(), sig)
  
      self._signal_recursion_protection_flag = False
      # return handler result
      return (
          org_handler
          if not callable(org_handler)
          else org_handler(sig, frame)
      )
  
file_path: clearml/clearml/utilities/process/exit_hooks.py
imports: import atexit
  import os
  import signal
  import sys
  import six
  from ...logger import Logger
label_desc: Use image node_id 9 for calling the ExitHooks obj's underlying member method code with example usage: obj.signal_handler(sig, frame) and returns: unknown, signal, unknown, unknown