【问题标题】:Kill a process that run in infinite loop杀死一个无限循环运行的进程
【发布时间】:2018-05-24 10:45:24
【问题描述】:

我从 c++ 代码创建了一个运行 python 脚本的进程。

STARTUPINFO si = {0};
PROCESS_INFOMATION pi = {0};
LPTSTR cmdArgs = _T("cmd.exe /k python myScript.py");
CreateProcess(NULL, cmdArgs, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);

脚本无限循环运行,例如:

while (1):
    print("hello")

我想终止该进程,但没有任何效果。 我尝试了TerminateProcess()taskkillpid - 他们报告该进程已终止但它仍在运行。

如何在进程运行时终止进程?

【问题讨论】:

  • 如果您有权访问代码,请添加外部终止条件(例如检测信号量或基于 IPC 的东西),这些条件会不时进行测试,并且可以从另一个应用程序设置...您也确定你要终止你想要的进程?你有足够高的特权吗?
  • 什么代码? Python?我不能改变它。是的,具体流程我确定..
  • 向我们展示如何使用 TerminateProcess 杀死它。
  • 我的答案中使用的 @rety TerminateProcess 对我有用,简单的 cmd 也可以执行 inf 循环。只是一件愚蠢的事情,因为我不是 Python 编码器,但 Python 脚本不会创建另一个具有不同句柄的进程/线程吗?
  • 您创建cmd.exe 进程的错误,这是毫无意义的。您需要直接创建目标进程。杀死它,而不是 cmd

标签: c++ windows winapi process


【解决方案1】:
LPTSTR cmdArgs = _T("cmd.exe /k python myScript.py");
CreateProcess(NULL, cmdArgs, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);

此代码创建cmd.exe 进程并创建python.exe 进程。问题 - 为什么创建中间 cmd.exe ?!你需要直接启动python.exe。使用 "python myScript.py" 命令行并直接启动 python.exe (如果使用 unicode W api 和空应用程序名称 - 字符串不能是只读的(在你的代码中它是只读的 - 所以你使用 A api,否则你有异常))

TerminateProcess 不起作用 - 因为你有 cmd.exe 的句柄,你可以终止它。但不是python.exe

taskkill 与 pid - 他们报告该进程已终止,但它仍然 正在运行。

当然 - pid 属于 cmd.exe 并且它已终止。但python.exe 仍在运行。

再次如此 - 解决方案非常简单 - 直接执行目标进程,无需 cmd.exe

【讨论】:

  • 你说得对!不确定,我想我必须打开 cmd 才能调用 python.. 谢谢!
猜你喜欢
  • 2014-01-14
  • 2014-05-07
  • 2013-08-04
  • 2011-03-30
  • 1970-01-01
  • 2016-10-26
  • 1970-01-01
  • 1970-01-01
  • 2021-01-05
相关资源
最近更新 更多