Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
未在子流程中激活Python SIGTERM处理程序_Python_Linux_Libc - Fatal编程技术网

未在子流程中激活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..."
该代码执行以下操作:

  • 指示操作系统将母模信号转换为SIGTERM
  • 分叉子进程
  • 如果是子进程,则注册信号处理程序并等待父进程终止
  • 在我的平台上,输出是

    $ 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()
    
    使用叉子后,它的行为正常