【发布时间】:2017-12-20 05:16:06
【问题描述】:
我正在开发一个启动 powershell 脚本以设置和启动服务进程(不是正式的 Windows 服务)的应用程序。我希望能够向这些 powershell 进程及其子进程发送 ctrl+c 信号以彻底关闭它们。
当我创建 powershell 进程时,我设置了 CREATE_NEW_PROCESS_GROUP,它隐式调用 SetConsoleCtrlHandler(NULL,TRUE),它有效地为创建的进程及其子进程关闭了 ctrl+c。我不能使用 ctrl+break 因为这会使 powershell 进入调试模式。所以在我启动的 powershell 进程中,我调用 SetConsoleCtrlHandler(NULL,FALSE) 重新打开 ctrl+c 并让我的应用程序然后调用 GenerateConsoleCtrlEvent 发送 ctrl+c 事件在我想停止该进程树时向 powershell 的进程组发送。这非常有效,但有一个主要缺陷。
如果我在运行我的应用程序的控制台中手动键入 ctrl+c,我的应用程序会拦截 ctrl+c 然后为每个 powershell 进程调用 GenerateConsoleCtrlEvent .这似乎运作良好,但只是第一次。
在我的应用程序退出后,似乎 ctrl+c 现在对于我在该控制台中运行的任何程序都已关闭。如果我运行PING 或我自己的应用程序,ctrl+c 什么都不做,我不确定如何进一步调试。
有趣的是,我有时会在进程资源管理器中看到 conhost.exe 中已死的 powershell 进程的句柄。如果我在进程资源管理器中关闭这些句柄,有时 ctrl+c 会回来。所以我怀疑有一些句柄泄漏,但这个观察结果并不一致,我小心翼翼地在我的应用程序中释放我的进程句柄。
有什么想法可能导致我的控制台的 ctrl+c 信号被吞没吗?
【问题讨论】:
-
UPDATE之后的所有内容都应删除并作为答案发布。是的,您可以回答自己的问题;不,我们不会因为你这样做而轻视你;不,答案不应嵌入问题中。 -
这很公平@JeroenMostert。我想这不是我真正想听到的答案,但可能是我将得到的最佳答案:)
-
如果您认为自己的答案不令人满意,您可以不接受自己的答案。 :-) 赏金是另一种吸引注意力的方式。
标签: windows powershell winapi console-application