如何使用 shell = true 使用 Python subprocess.Popen() 将 SIGINT 传递给子进程

Mik*_*ike 7 python gdb subprocess popen sigint

我目前正在尝试为 GDB 编写(Python 2.7.3)类型的包装器,这将允许我从脚本输入动态切换到与 GDB 的交互式通信。

到目前为止我使用

self.process = subprocess.Popen(["gdb vuln"], stdin = subprocess.PIPE,  shell = True)
Run Code Online (Sandbox Code Playgroud)

在我的脚本中启动 gdb。(vuln是我要检查的二进制文件)

由于 gdb 的一个关键特性是暂停附加进程的执行并允许用户在接收 SIGINT (STRG+C) 时检查寄存器和内存,因此我确实需要某种方式将 SIGINT 信号传递给它。

两者都不

self.process.send_signal(signal.SIGINT)
Run Code Online (Sandbox Code Playgroud)

也不

os.kill(self.process.pid, signal.SIGINT)
Run Code Online (Sandbox Code Playgroud)

或者

os.killpg(self.process.pid, signal.SIGINT)
Run Code Online (Sandbox Code Playgroud)

为我工作。

当我使用这些功能之一时,没有响应。我想这个问题是由于使用shell=True. 然而,在这一点上我真的没有想法。就连我的老朋友谷歌这次也帮不了我,所以也许你能帮帮我。提前致谢。

干杯,迈克

sir*_*rex 6

这对我有用:

import signal
import subprocess

try:
    p = subprocess.Popen(...)
    p.wait()
except KeyboardInterrupt:
    p.send_signal(signal.SIGINT)
    p.wait()
Run Code Online (Sandbox Code Playgroud)


Ram*_*h K 0

我过去做过类似以下的事情,如果我记得它似乎对我有用:

def detach_procesGroup():
    os.setpgrp()

subprocess.Popen(command,
                 stdout=subprocess.PIPE,
                 stderr=subprocess.PIPE,
                 preexec_fn=detach_processGroup)
Run Code Online (Sandbox Code Playgroud)