[Python-Dev] Python signal processing question (original) (raw)

Michael Crute mcrute at gmail.com
Tue Jul 20 03:22:39 CEST 2010


On Mon, Jul 19, 2010 at 12:11 PM, Scott McCarty <scott.mccarty at gmail.com> wrote:

All, I have searched everywhere (mostly the code and a little google) and I cannot understand where the SIGKILL signal gets checked when it is set as a handler. I have scoured the Modules/signalmodule.c only to find two instances of the RuntimeError exception, but I cannot understand how python knows when a handler is set for SIGKILL. I understand that this changed in 2.4 and I am not trying to change it, I just really want to understand where this happens. I used grep to find SIGKILL and SIGTERM to see if I could determine where the critical difference is, but I cannot figure it out.

I have about 2 hours of searching around and I can't figure it out, I assume it has to rely on some default behaviour in Unix, but I have no idea. I don't see a difference between SIGKILL and SIGTERM in the python code, but obviously there is some difference. I understand what the difference is in Unix/Linux, I just want to see it in the python code. Since python is checking at run time to see what signals handlers are added, I know there must be a difference.

The signals get initialized at interpreter startup within the initsigs function (Python/pythonrun.c). By default the interpreter ignores SIGPIPE, SIGXFZ and SIGXFSZ. Eventually initsignal (Modules/signalmodule.c) which will loop over an array of all handlers and set their handlers to the default handler, ignore handler or None, depending on the default state of the handler as reported by the OS. After all of that python will register its own signal handler for SIGINT which raises a KeyboardInterrupt error (you can change this).

By default on Linux SIGKILL gets a None handler since it can not be handled or ignored (as dictated by the OS) and SIGTERM gets the default handler which at least under Linux is to terminate the program without doing any kind of cleanup.

It is worth noting that you can handle SIGTERM but python chooses not to do this by default.

Doug Hellmann wrote a post about the signal module that is a good complement to the C code for understanding how signals are handled in python. http://www.doughellmann.com/PyMOTW/signal/

HTH.

-mike

-- Michael E. Crute http://mike.crute.org

It is a mistake to think you can solve any major problem just with potatoes. --Douglas Adams



More information about the Python-Dev mailing list