【问题标题】:windows ctrl + c signals not firingwindows ctrl + c 信号不触发
【发布时间】: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


【解决方案1】:

似乎在用户调用 ctrl+c 之后触发 GenerateConsoleCtrlEvent 会使 shell 进入这种奇怪的状态。当用户输入 ctrl+c 时,我的应用程序实际上不需要调用 GenerateConsoleCtrlEvent,因为 GenerateConsoleCtrlEvent 会广播到控制台中的每个进程。不幸的是,让我的应用程序在拦截 ctrl+c 时放弃 GenerateConsoleCtrlEvent 说起来容易做起来难,但并非不可能。

令人不安的是,我没有找到任何文档或信息表明在键入 ctrl+c 后触发 GenerateConsoleCtrlEvent 会产生这种奇怪的效果,但也许这篇文章会对某人有所帮助否则。

如果有人对触发此状态的原因有更详细的了解,或者有其他方法可以避免这种情况并使 shell 对GenerateConsoleCtrlEvent 更具弹性,请在此处发布另一个答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-16
    • 1970-01-01
    • 2016-01-08
    • 1970-01-01
    • 2011-04-08
    • 2013-12-19
    • 1970-01-01
    相关资源
    最近更新 更多