Advertisement
DeaD_EyE

playing around with signals 1

Mar 31st, 2021
1,004
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import atexit
  2. import os
  3. import signal
  4. import subprocess
  5. import sys
  6. import threading
  7. import time
  8.  
  9.  
  10. class SignalException(Exception):
  11.     ...
  12.  
  13.  
  14. pid = os.getpid()
  15. print("PID is", pid)
  16.  
  17.  
  18. def raiser(signal, *rest):
  19.     raise SignalException(f"Got signal {signal}", signal)
  20.  
  21.  
  22. def kill(pid, sig, delay):
  23.     time.sleep(delay)
  24.     os.kill(pid, sig)
  25.  
  26.  
  27. if len(sys.argv) == 2:
  28.     try:
  29.         signal_value = int(sys.argv[1])
  30.     except ValueError:
  31.         try:
  32.             sig = sys.argv[1].upper()
  33.             signal_value = signal.Signals[sig]
  34.         except KeyError:
  35.             raise SystemExit("A valid signal number or signal name is required")
  36.  
  37.     try:
  38.         signal_type = signal.Signals(signal_value)
  39.     except ValueError:
  40.         raise SystemExit("Signal is unkown")
  41. else:
  42.     signal_value = None
  43.     signal_type = None
  44.  
  45.  
  46. class Button:
  47.     buttons = []
  48.  
  49.     def __init__(self, pin):
  50.         self.pin = pin
  51.         self.buttons.append(self)
  52.  
  53.     @classmethod
  54.     def close_all(cls):
  55.         for button in cls.buttons:
  56.             print("Closing button", button.pin)
  57.             button.close()
  58.  
  59.     def close(self):
  60.         ...
  61.  
  62.  
  63. atexit.register(Button.close_all)
  64. [Button(x) for x in range(10)]
  65.  
  66. if signal_type:
  67.     # must be set in MainThread
  68.     try:
  69.         signal.signal(signal_type, raiser)
  70.     except OSError:
  71.         raise SystemExit("Invalid Signal")
  72.  
  73.  
  74.     # Run a worker thread to signal myself.
  75.     threading.Thread(target=kill, args=(pid, signal_type, 2), daemon=True).start()
  76.  
  77. try:
  78.     time.sleep(3600)
  79. except KeyboardInterrupt:
  80.     print("Got CTRL+C")
  81. except SignalException as sig:
  82.     print(sig.args[0])
  83.     sys.exit(sig.args[1])
  84.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement