I have a program spawning and communicating with cpu heavy, unstable processes, not created by me. If my app crashes or is killed by sigkill, I want the subprocesses to get killed as well, so the user don´t have to track them down and kill them manually.
I know this topic has been covered before, but I have tried all methods described, and none of them seams to live up to survive the test.
I know it must be possible, since terminals do it all the time. If I run something in a terminal, and kill the terminal, the stuff always dies.
I have tried atexit, double fork and ptys. atexit doenst work for sigkill; double fork doesnt work at all; and ptys I have found no way to work with using python.
Today I found out about prctl(PR_SET_PDEATHSIG, SIGKILL), which should be a way for childprocesses to order a kill on themselves, when their parent dies. I tried to use it in python, with popen, but it seams to have no effect at all:
import ctypes, subprocess
libc = ctypes.CDLL('/lib/libc.so.6')
PR_SET_PDEATHSIG = 1; TERM = 15
implant_bomb = lambda: libc.prctl(PR_SET_PDEATHSIG, TERM)
subprocess.Popen(['gnuchess'], preexec_fn=implant_bomb)
In the above the child is created and the parent exits. Now you would expect gnuchess to recieve a SIGKILL and die, but it doesnt. I can still find it in my process mamager using 100% cpu.
Can anybody tell me if there is something wrong with my use of prctl?, or do you know how terminals manage to kill their children?