def reg_sighandler(self, debug: bool = False, buf: Type.BufT = Type.BufT.DEBUG) -> None: if debug: Printer.Printer.inst().buf( Printer.Printer.inst().f_title('signal handler info'), buf) Printer.Printer.inst().buf('@target: ', buf, indent=2) for i in range(len(self.__sig_handler)): Printer.Printer.inst().buf( f'[{i}] {self.__sig_handler[i].brief}({self.__sig_handler[i].sig})', buf, indent=4) Printer.Printer.inst().buf_newline(buf) Printer.Printer.inst().buf( Printer.Printer.inst().f_title('registering signal handler'), buf) for handler in self.__sig_handler: Printer.Printer.inst().buf( Printer.Printer.inst().f_prog( f'Registering {handler.brief} handler'), buf, False, 2) try: signal.signal(handler.sig, handler.handler) except OSError as os_err: Printer.Printer.inst().buf( Printer.Printer.inst().f_col('fail', Type.Col.RED), buf) raise Error.SysErr(Type.SysErrT.REG_FAIL, sig=handler.brief, err_str=os_err.strerror) else: Printer.Printer.inst().buf( Printer.Printer.inst().f_col('done', Type.Col.BLUE), buf) Printer.Printer.inst().buf(f'@handler: {handler.handler}', buf, indent=4) Printer.Printer.inst().buf_newline(buf) else: for handler in self.__sig_handler: try: signal.signal(handler.sig, handler.handler) except OSError as os_err: raise Error.SysErr(Type.SysErrT.REG_FAIL, sig=handler.brief, err_str=os_err.strerror)
def timeout(lim: int) -> None: try: signal.signal(signal.SIGALRM, sigalrm_handler) except OSError as os_err: raise Error.SysErr(Type.SysErrT.REG_FAIL, sig='SIGALRM', err_str=os_err.strerror) if lim > 0: signal.alarm(lim) try: yield except TimeoutError: pass finally: signal.alarm(0) try: signal.signal(signal.SIGALRM, signal.SIG_IGN) except OSError as os_err: raise Error.SysErr(Type.SysErrT.UNREG_FAIL, sig='SIGALRM', err_str=os_err.strerror)
def sigalrm_handler(sig, frame) -> None: raise Error.SysErr(Type.SysErrT.TIMEOUT)