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

2024-04-19 23:55:24 发布

您现在位置: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上运行,该pid与p.pid返回的pid不同(通常是几个整数,即p.pid返回3031,但a.out是3035)。有什么我误解的吗


Tags: 对象函数send可执行文件signal信号sudo流程
1条回答
网友
1楼 · 发布于 2024-04-19 23:55:24

实际上,您正在获得并终止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})

相关问题 更多 >