【问题标题】:Terminating Process in Windows 10 OS在 Windows 10 操作系统中终止进程
【发布时间】:2018-07-19 16:07:52
【问题描述】:

背景信息:我正在开发一个 Windows 10 应用。在我的应用程序中,一些输出显示在需要新进程的窗口控制台上。

代码片段:

PROCESS_INFORMATION pi;
STARTUPINFO si;
// CreateProcess is defined in processthreadsapi.h
BOOL newProcess = CreateProcess (
0, pszCmdLine, 0, 0, FALSE, DEBUG_THIS_ONLY_PROCESS, 0, 0, &si, &pi
);

在上面的代码 sn-p 中,pszCmdLine 可以是 "cmd.exe /c dir""cmd.exe /c ipconfig",或者基本上是任何 Windows 终端 cmd。

问题:在前端,会生成一个新的cmd 控制台,用户可以将其终止。但是,它在后台保持活跃。我在下面附上了截图:

进程累积前:

在上面的片段中,它显示了 "cmd.exe /c dir" 正在执行并输出到一个 cmd 控制台。

进程累积后:

在上面的片段中,它显示了我如何启动相同的cmd 4 次并关闭它 3 次(即计数器是“(4)”,包括主进程)。

现实世界的问题:这实质上是在消耗内存并且会降低性能。

Initial Curiosity:当用户点击“x”时,Windows操作系统不应该处理这个进程的终止吗?

以前有没有人遇到过类似的问题?

【问题讨论】:

  • 是否将DEBUG_THIS_ONLY_PROCESS 标志更改为默认帮助?
  • 你用什么DEBUG_ONLY_THIS_PROCESS ?你真的调试过程吗?
  • 您是否关闭了 CreateProcess 在 PROCESS_INFORMATION 结构中返回的进程和线程句柄?
  • @SaileshD 你是对的。由于使用“DEBUG_THIS_ONLY_PROCESS”,错误仍然存​​在。将其更改为默认值(0 或 CREATE_NEW_CONSOLE)解决了问题!

标签: c++ windows multithreading process window


【解决方案1】:

解决方案:

DEBUG_ONLY_THIS_PROCESS 更改为0 CREATE_NEW_CONSOLE

我的想法:

我想DEBUG_ONLY_THIS_PROCESS 背后的想法是让窗口句柄保持打开状态以供用户观察输出,而CREATE_NEW_CONSOLE 根据需要分配和释放内存。

【讨论】:

  • 这与窗口句柄无关。在“调试器”(您的应用程序)分离之前,流程管理器不会完全获取和销毁 Process 对象,例如DebugActiveProcessStop(pi.dwProcessId)。当然,由于您没有编写任何类型的调试器,因此使用此标志毫无意义。
  • 至于控制台窗口,仅供参考,CMD 是一个外壳,而不是控制台或终端。它使用由 conhost.exe 实例托管的控制台。当控制台关闭时,系统会终止连接到控制台的所有进程,但它不能完全销毁具有附加调试器的进程。
  • 旧的视觉工作室有这个错误(我在 VS 2013 和 '17 的后期还没有看到这个错误),即使在调试停止后僵尸控制台也不会消失。这更有可能是VS的一个错误。如果有兴趣,您可以在 MSDN 论坛中提出相同的问题。
  • 谢谢你们。感谢您的反馈和知识!
猜你喜欢
  • 2015-03-20
  • 1970-01-01
  • 2019-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多