【发布时间】:2017-10-31 17:37:45
【问题描述】:
我在 VS2017/Windows 10 中构建了以下程序。当我运行它时,我点击关闭并按预期调用 ctrl_handler(),但在大约三秒后,该进程无论如何都会被强制终止。
这是一个问题,因为我的实际应用程序写入了大型日志文件,而三秒不足以将它们写入磁盘。
描述此行为的文档在哪里?它不在those for the CTRL+CLOSE signal 中。
超时设置在哪里?是否可以在应用程序级别进行修改?还是使用组策略?
#include <Windows.h>
bool mainThreadRunning;
bool mainThreadFinished;
BOOL ctrl_handler(DWORD event)
{
if (event == CTRL_CLOSE_EVENT) {
mainThreadRunning = false;
while (!mainThreadFinished) {
Sleep(100);
}
return TRUE;
}
return FALSE;
}
int main()
{
mainThreadRunning = true;
mainThreadFinished = false;
SetConsoleCtrlHandler((PHANDLER_ROUTINE)(ctrl_handler), TRUE); // make sure when the user hits the close button in the console we shut down cleanly
while (true)
{
}
return 0;
}
【问题讨论】:
-
为了发送控制事件,控制台主机(conhost.exe)请求会话服务器(csrss.exe)在客户端创建一个控制线程。该线程从
kernelbase!CtrlRoutine开始并调用注册的处理程序,直到处理程序返回TRUE或者它到达调用ExitProcess(STATUS_CONTROL_C_EXIT)的默认处理程序(kernelbase!DefaultHandler)。 Vista 和更高版本不允许处理程序通过为关闭事件返回 true 来保持进程(和控制台)处于活动状态。相反,会话服务器等待 5 秒,如果进程没有退出,则终止进程。
标签: c++ windows winapi console-application