繁体   English   中英

Python 信号处理程序在 linux 克隆系统调用后在子进程中不起作用

[英]Python signal handler not work in child process after linux clone syscall

需要一些帮助,专家。

我在 stackoverflow.com 中找到了一个主题, 在 python 中克隆进程支持 所以就像它建议的那样,我调用 function 在新的 linux 命名空间中创建子进程。

def ns_clone(func):
    stack = ctypes.c_char_p((' ' * STACK_SIZE).encode("utf_8"))
    stack_top = ctypes.cast(stack, ctypes.c_void_p).value + STACK_SIZE
    pid = libc.clone(ctypes.CFUNCTYPE(None)(func), ctypes.c_void_p(stack_top),
                     CLONE_NEWNS | CLONE_NEWUTS  | CLONE_NEWUTS | signal.SIGCHLD) 
    if pid < 0:
        libc.perror("clone")

如果克隆成功。 并且新的命名空间也可以正常工作。 但是我遇到了一些问题:在子进程中,我想分叉更多的被监禁的进程来服务。 所以我尝试为 SIGALRM 和 SIGCLD 设置处理程序(我想处理请求超时和感知孙子进程终止)。 但它永远不会奏效。 没有引发错误,但似乎这个 python 子进程并不关心我设置的内容。

signal.signal(signal.SIGALRM, _timeout_callback)
signal.signal(signal.SIGCLD, _child_term_callback)
signal.alarm(15)

我已经调查了几天。 但我真的是 C 语言和操作系统级编程的新手。 我发现的唯一线索是,如果我使用普通的 os.fork,则不存在此问题。 另一个在 python 文档中,它说 python 信号处理程序不是原始操作系统级别的处理程序,并且 python 处理程序始终运行在一个进程的主线程中。 但我不确定有什么关系。

在 linux 克隆系统调用之后,我是否可以在 python 进程中设置一些信号处理程序? 感谢帮助 !

我的环境:Ubuntu 18.04 Desktop/CPython 3.7

最后,我使用 python 自己的“os.fork”创建子进程并使用“unshare”进入命名空间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM