从 python 框架向 sudoed C 子进程发送 Ctrl+C SIGINT

Sending a Ctrl+C SIGINT to sudoed C subprocess from python framework

我是 运行 一个 python 子进程,使用

p = Popen(["sudo", "./a.out"])

其中 a.out 是一个 C 可执行文件,它会连续运行,直到向其发送 SIGINT 或 Ctrl+C 信号。我在使用 subprocess.Popen 对象函数(例如 send_signal() 时遇到了麻烦,因为 Operation not permitted 错误是由于可执行文件的 sudo 性质引起的。在此之后,我尝试通过以下方式向子进程发送 SIGINT:

os.system(f"sudo kill -2 {p.pid}")

但这似乎没有正确定位流程。 运行 快速 sudo netstat -lpnt 检查显示 a.out 进程仍在 运行 上的 pid 与 p.pid 返回的不同(通常是几个整数,即 p.pid returns 3031 但 a.out 是 3035)。我有什么误解吗?

您实际上正在获取 pid 并终止 sudo 进程(它分叉了您的应用程序进程)。相反,您应该使用以下命令终止整个进程组:

import subprocess, os
p = Popen(["sudo", "./a.out"])
pgid = os.getpgid(p.pid)
subprocess.check_output("sudo kill {}".format(pgid))

或借助 pkill:

import subprocess
p = Popen(["sudo", "./a.out"])
subprocess.call(f"sudo pkill -2 -P {p.pid})