Calling setsid in pre_exec isn't exactly correct, you'd do this to daemonize a process in order to prevent it from getting signals from the process which spawned you exited or its terminal disconnected.
If you read exit(3) you'll see that you also need a controlling terminal for the kernel to send SIGHUP to the processes in your foreground process group.
In python it'd look roughly like:
master, slave = os.openpty()
# ensure we can call setsid successfully
try:
pid = os.fork()
if pid > 0:
os.close(master)
os.close(slave)
sys.exit(0)
finally:
sys.exit(1)
os.setsid()
# we are now session leader and process group leader
fcntl.ioctl(master, termios.TIOCSCTTY, 0)
# we now have a controlling pty - closing master will send us a SIGHUP
os.close(slave)
# go start spawning subprocesses - if _this_ process is killed, they will receive SIGHUPs. Unless they take themselves out of your session or the foreground process group.
If you read exit(3) you'll see that you also need a controlling terminal for the kernel to send SIGHUP to the processes in your foreground process group.
In python it'd look roughly like: