gpt4 book ai didi

Windows ctrl + c 信号未触发

转载 作者:可可西里 更新时间:2023-11-01 09:27:46 26 4
gpt4 key购买 nike

我正在开发一个启动 powershell 脚本以设置和启动服务进程(不是正式的 Windows 服务)的应用程序。我希望能够向这些 powershell 进程及其子进程发送 ctrl+c 信号以完全关闭它们。

当我创建 powershell 进程时,我设置了 CREATE_NEW_PROCESS_GROUP 隐式调用 SetConsoleCtrlHandler(NULL,TRUE) 有效地关闭了 ctrl+c 用于创建的进程及其子进程。我不能使用 ctrl+break 因为这会使 powershell 进入 Debug模式。因此,在我启动的 powershell 进程中,我调用 SetConsoleCtrlHandler(NULL,FALSE) 来打开 ctrl+c 并让我的应用程序调用GenerateConsoleCtrlEvent 当我想停止该进程树时,将 ctrl+c 事件发送到 powershell 的进程组。这很完美,但有一个主要缺陷。

如果我在运行我的应用程序的控制台中手动键入 ctrl+c,我的应用程序会拦截 ctrl+c,然后调用 GenerateConsoleCtrlEvent 对于每个 powershell 进程。这似乎运作良好,但只是第一次。

在我的应用程序退出后,似乎 ctrl+c 现在对于我在该控制台中运行的任何程序都已关闭。如果我运行 PING 或我自己的应用程序,ctrl+c 什么都不做,我不确定如何进一步调试。

有趣的是,我有时会在进程资源管理器中看到 conhost.exe 中死掉的 powershell 进程的句柄。如果我在进程资源管理器中关闭这些句柄,有时 ctrl+c 会返回。所以我怀疑有些句柄泄漏,但这种观察结果并不一致,我小心翼翼地在我的应用程序中释放我的进程句柄。

关于可能导致我的控制台的 ctrl+c 信号被吞没的任何想法?

最佳答案

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

令人不安的是,我没有发现任何文档或信息说明在键入 ctrl+c 后触发 GenerateConsoleCtrlEvent 会产生这种奇怪的效果,但也许这篇文章将帮助其他人。

如果有人深入了解此状态为何被触发的更多详细信息或关于避免它并使 shell 对 GenerateConsoleCtrlEvent 更具弹性的其他方法的提示,请在此处发布另一个答案。

关于Windows ctrl + c 信号未触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45114227/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com