c – 在Win32上处理CTRL C.
作者:互联网
我在Win32 C控制台程序中处理CTRL C事件时遇到一些问题.
基本上我的程序看起来像这样:(基于这个其他问题:Windows Ctrl-C – Cleaning up local stack objects in command line app)
bool running;
int main() {
running = true;
SetConsoleCtrlHandler((PHANDLER_ROUTINE) consoleHandler, TRUE);
while (running) {
// do work
...
}
// do cleanup
...
return 0;
}
bool consoleHandler(int signal) {
if (signal == CTRL_C_EVENT) {
running = false;
}
return true;
}
问题是根本没有执行清理代码.
执行处理程序函数后,进程终止,但不执行主循环后的代码.怎么了?
编辑:根据要求,这是一个类似于我的程序的最小测试用例:http://pastebin.com/6rLK6BU2
我的输出中没有得到“test cleanup-instruction”字符串.
我不知道这是否重要,我正在与MinGW进行编译.
编辑2:测试用例程序的问题是使用Sleep()函数.没有它,程序按预期工作.
在Win32中,函数处理程序在另一个线程中运行,因此当处理程序/线程结束其执行时,主线程正在休眠.可能这是过程中断的原因?
解决方法:
以下代码适用于我:
#include <windows.h>
#include <stdio.h>
BOOL WINAPI consoleHandler(DWORD signal) {
if (signal == CTRL_C_EVENT)
printf("Ctrl-C handled\n"); // do cleanup
return TRUE;
}
int main()
{
running = TRUE;
if (!SetConsoleCtrlHandler(consoleHandler, TRUE)) {
printf("\nERROR: Could not set control handler");
return 1;
}
while (1) { /* do work */ }
return 0;
}
标签:c,winapi,console-application 来源: https://codeday.me/bug/20190928/1828424.html