[英]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.