Signals are identified by integers and are defined in the operating system C headers. Python exposes the signals appropriate for the platform as symbols in the 'signal' module. the signal module in python is used to install your own signal handlers. When the interpreter sees a signal, the signal handler associated with that signal is executed as soon as possible. signal handler is a call back function, t he arguments to the signal handler are the signal number and the stack frame from the point in your program that was interrupted by the signal. First basic example: import signal,timedef signal_handler(signum, stack): print 'Received:', signumsignal.signal(signal.SIGHUP, signal_handler)signal.signal(signal.SIGINT, signal_handler)
signal.signal(15, signal_handler)while True: print 'Waiting...try kill using signal 1(SIGHUP) or 2(SIGINT)' time.sleep(3)
Linux Standard signals: from signal man page: Signal Value Action Comment ------------------------------------------------------------------------- SIGHUP 1 Term Hangup detected on controlling terminal or death of controlling process SIGINT 2 Term Interrupt from keyboard SIGQUIT 3 Core Quit from keyboard SIGILL 4 Core Illegal Instruction SIGABRT 6 Core Abort signal from abort(3) SIGFPE 8 Core Floating point exception SIGKILL 9 Term Kill signal SIGSEGV 11 Core Invalid memory reference SIGPIPE 13 Term Broken pipe: write to pipe with no readers SIGALRM 14 Term Timer signal from alarm(2) SIGTERM 15 Term Termination signal SIGUSR1 30,10,16 Term User-defined signal 1 SIGUSR2 31,12,17 Term User-defined signal 2 SIGCHLD 20,17,18 Ign Child stopped or terminated SIGCONT 19,18,25 Cont Continue if stopped SIGSTOP 17,19,23 Stop Stop process SIGTSTP 18,20,24 Stop Stop typed at tty SIGTTIN 21,21,26 Stop tty input for background process SIGTTOU 22,22,27 Stop tty output for background process The signals SIGKILL and SIGSTOP cannot be caught, blocked, or ignored. How to trap all the signals (except few..!!) ?? here is the example: #!/usr/bin/pythonimport signaldef sighandler(signum, frame): print "Caough signal :", signumfor x in dir(signal): if x.startswith("SIG"): try: signum = getattr(signal,x) signal.signal(signum,sighandler) except: print "Skipping %s"%x while True: pass
Printing stack frames : The frame argument is the stack frame also known as execution frame. It point to the frame that was interrupted by the signal. to print the stack trace you need to use ' traceback' module. this is very useful in multi-threaded program because any thread might be interrupted by a signals and signal is only received by the main program. #!/usr/bin/pythonimport signal,tracebackdef sighandler(signum, frame): print "Caough signal :", signum traceback.print_stack(frame)for sig in dir(signal): if sig.startswith("SIG"): try: signum = getattr(signal,sig) signal.signal(signum,sighandler) except: print "Skipping %s"%sig while True: pass
Ignoring signals: To ignore a signal, register SIG_IGN as the handler (no call back required). This will ignore the ctr+c signal raised from terminal. #!/usr/bin/pythonimport signalsignal.signal(signal.SIGINT,signal.SIG_IGN)while True: pass