其他分享
首页 > 其他分享> > c – 在Win32上处理CTRL C.

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