ZeroMQ:如何在Windows上处理Ctrl-C

ZeroMQ: How to handle Ctrl-C on Windows

本文关键字:处理 Ctrl-C Windows ZeroMQ      更新时间:2023-10-16

我想知道如何处理从Windows控制台发出的Ctrl-C

#include <iostream>
#include <zmq.hpp>
#include <windows.h>
BOOL WINAPI consoleHandler( DWORD dwCtrlType ) {
    // what to do here?
    return TRUE;
}
int main() {
    SetConsoleCtrlHandler( consoleHandler, TRUE );
    zmq::context_t context( 1 );
    zmq::socket_t socket( context, ZMQ_REP );
    socket.bind( "tcp://*:5555" );
    while ( true ) {
        zmq::message_t request;
        try {
            socket.recv( &request );
        }
        catch(zmq::error_t& e) {
            std::cout << "zmq error" << std::endl;
        }
    }
}

这将安装一个处理程序函数,该函数可以对来自控制台的CTRL_C_EVENT进行操作。目前,它什么都不做。因此,revc调用不会失败引发异常,如此处所述(在"错误处理"中)。

我想做的是在异常处理程序中break循环,并让C++绑定的 RAII 功能在退出main()时执行所需的清理。

通常我创建一个标志或某种排序 - 全局布尔值或内核事件。

然后你循环等待这个标志被重置 - 所以在你的例子中,我会创建一个简单的全局布尔值,然后循环它而不是 while (true)。

所以:

bool g_shutdown = false;
BOOL WINAPI consoleHandler( DWORD dwCtrlType ) {
    g_shutdown = true;
    return TRUE;
}
while (!g_shutdown)
{
// do your zmq work
}

它简单但有效 - 尽管这不会杀死您的程序,直到 zmq 工作再次进入 while 循环检查。(您通常可以通过关闭套接字变量来执行此操作)

为了更健壮(即更快地杀死,具体取决于您的情况),请使用 Event 和 WaitforMultipleObject 调用来等待此关闭事件和程序正在等待的任何其他事件(即套接字的 recv 调用)。