mirror of https://github.com/akuker/RASCSI.git
42 lines
942 B
Python
42 lines
942 B
Python
"""
|
|
Linux interrupt handling module
|
|
"""
|
|
|
|
import signal
|
|
|
|
|
|
class GracefulInterruptHandler:
|
|
"""
|
|
Class for handling Linux signal interrupts
|
|
"""
|
|
|
|
def __init__(self, signals=(signal.SIGINT, signal.SIGTERM)):
|
|
self.signals = signals
|
|
self.original_handlers = {}
|
|
self.interrupted = False
|
|
self.released = False
|
|
|
|
def __enter__(self):
|
|
for sig in self.signals:
|
|
self.original_handlers[sig] = signal.getsignal(sig)
|
|
signal.signal(sig, self.handler)
|
|
|
|
return self
|
|
|
|
def handler(self, signum, frame):
|
|
self.release()
|
|
self.interrupted = True
|
|
|
|
def __exit__(self, exception_type, exception_value, traceback):
|
|
self.release()
|
|
|
|
def release(self):
|
|
if self.released:
|
|
return False
|
|
|
|
for sig in self.signals:
|
|
signal.signal(sig, self.original_handlers[sig])
|
|
|
|
self.released = True
|
|
return True
|