未在子流程中激活Python SIGTERM处理程序
我想用事件处理程序在代码中优雅地释放一些昂贵的系统资源。 问题是,事件处理程序在分叉子进程中注册(是的,我必须将事件处理程序放在子进程中,因为资源是在分叉之后分配的),并且我希望子进程在父进程死亡时终止。 然而,代码并没有像我期望的那样工作 以下是一个可运行的示例:未在子流程中激活Python SIGTERM处理程序,python,linux,libc,Python,Linux,Libc,我想用事件处理程序在代码中优雅地释放一些昂贵的系统资源。 问题是,事件处理程序在分叉子进程中注册(是的,我必须将事件处理程序放在子进程中,因为资源是在分叉之后分配的),并且我希望子进程在父进程死亡时终止。 然而,代码并没有像我期望的那样工作 以下是一个可运行的示例: import time import os import signal PRCTL=None # get prctl from libc def getPRCTL(): global PRCTL if PRCTL
import time
import os
import signal
PRCTL=None
# get prctl from libc
def getPRCTL():
global PRCTL
if PRCTL is None:
import ctypes
PRCTL = ctypes.CDLL("libc.so.6")["prctl"]
return PRCTL
def dieWithParent():
prctl = getPRCTL()
prctl(1, signal.SIGTERM) # 1 = PR_SET_PDEATHSIG
def foo():
print "In foo."
def handler(signo, frame):
print "Handler is activated."
signal.signal(signal.SIGTERM, handler)
time.sleep(10) # in case sub-process terminates first.
if __name__ == '__main__':
dieWithParent()
pid = os.fork()
if 0 == pid:
foo()
else:
print "Subprocess spawned."
print "dying..."
该代码执行以下操作:
$ python main.py
In foo.
Subprocess spawned.
dying...
处理程序似乎未激活
我的代码或理解有问题吗
我的盒子上的配置是
2.6.18-238.el5 x86_64
Python 2.6
任何提示都将不胜感激,谢谢 如果这是试图编写守护程序,则应查找双分叉 例如:来自 PR_SET_PDEATHSIG(自Linux 2.1.57以来)设置父进程死亡 调用进程发送到arg2的信号(在 范围1..maxsig,或0清除)。这是呼叫的信号 当其父进程死亡时,进程将获得此值已清除 执行 设置用户ID或设置组ID二进制文件 所以,基本上你要确保你的父母和他的父母一起死去,但不要说你的孩子的死亡过程 如果您添加:
dieWithParent()
使用叉子后,它的行为正常