簡體   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