gpt4 book ai didi

c++ - 使用 boost asio 捕捉 Ctrl-C

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:27:05 25 4
gpt4 key购买 nike

我正在尝试在应用程序中捕获 Ctrl-C,如下面的 MWE 所示

#include <boost/asio/signal_set.hpp>
#include <iostream>

void handler( const boost::system::error_code& error , int signal_number )
{
std::cout << "handling signal " << signal_number << std::endl;
}

int main( int argc , char** argv )
{
boost::asio::io_service io_service;

// Construct a signal set registered for process termination.
boost::asio::signal_set signals(io_service, SIGINT );

// Start an asynchronous wait for one of the signals to occur.
signals.async_wait( handler );

char choice;
while( true )
{
std::cout << "Press a key: " << std::endl;
std::cin >> choice;
}
}

不幸的是,当我按下 Ctrl+C 时,handler() 没有被调用。相反,循环不再等待用户输入,如下所示:

c:\tmp>CtrlC.exe
Press a key:
d
Press a key:
e
Press a key:
Press a key:
Press a key:
Press a key:
Press a key:
Press a key:
Press a key:
Press a key:
Press a key:

如果重要的话,我在 Windows 上,我知道有一种 Windows 特定的方法可以捕获 Ctrl+C 但我想在以下情况下使用 boost可能便于移植。

最佳答案

boost ASIO 以 io_service 对象为中心,您请求的所有任务(尤其是异步任务)通常都由 io_service 处理。

通过做:

// Start an asynchronous wait for one of the signals to occur.
signals.async_wait( handler );

您需要服务异步等待信号并在信号发生时调用您的处理程序

问题是,您的 io_service 没有运行。

所以如果你想让它正常工作你需要启动它:

#include <boost/asio/signal_set.hpp>
#include <iostream>

void handler( const boost::system::error_code& error , int signal_number )
{
std::cout << "handling signal " << signal_number << std::endl;
exit(1);
}

int main( int argc , char** argv )
{
boost::asio::io_service io_service;

// Construct a signal set registered for process termination.
boost::asio::signal_set signals(io_service, SIGINT );

// Start an asynchronous wait for one of the signals to occur.
signals.async_wait( handler );

io_service.run();
}

然后按 Ctrl + C 将执行您期望的操作。

请注意,io_service 基本上取代了您的无限循环,因此您在其中所做的任何事情都应该成为 io_service 的任务。

关于c++ - 使用 boost asio 捕捉 Ctrl-C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42342305/

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