Is registered atexit handler inherited by spawned child processes?

atexit, multiprocessing, python

Solution

There isn't an API to do it in Python 2.5, but you can just:

import atexit
atexit._exithandlers = []

in your child processes - if you know you only have one exit handler installed, and that no other handlers are installed. However, be aware that some parts of the stdlib (e.g. `logging`) register `atexit` handlers. To avoid trampling on them, you could try:

my_handler_entries = [e for e in atexit._exithandlers if e[0] == my_handler_func]
for e in my_handler_entries:
    atexit._exithandlers.remove(e)

where `my_handler_func` is the `atexit` handler you registered, and this should remove your entry without removing the others.

Problem

I am writing a daemon program using python 2.5. In the main process an exit handler is registered with `atexit` module, it seems that the handler gets called when each child process ends, which is not I expected. I noticed this behavior isn't mentioned in python `atexit` doc, anybody knows the issue? If this is how it should behave, how can I unregister the exit handler in children processes? There is a atexit.unregister in version 3.0, but I am using 2.5.

Original source