将信号转发到使用Popen创建的子进程

问题描述

我有一个Python程序,它是任意(即非Python)程序的薄包装。包装器使用Popen启动包装的程序。

但是,有时包装的程序会忽略诸如SIGINTSIGTERM之类的信号。结果是,当包装程序正在运行这样的程序并收到CTRL-C时,仅包装程序被杀死,而被包装的程序继续运行。

是否可以让包装器捕获任何信号,然后将其“转发”给包装的程序?

我可以在包装器中使用更atexit.register这样更复杂的东西,以在包装器终止时终止子进程,但是我认为转发信号可能更干净?

解决方法

您可以尝试这样的事情

import subprocess
import signal

wrapped_proc = subprocess.Popen(...)

def signal_handler(signum,frame):
    wrapped_proc.send_signal(signum)
    # anything else

signal.signal(signal_handler,signal.SIGINT)

链接到signal documentation