Olu*_*ide 4 c++ boost signals boost-asio
我正在尝试在应用程序中按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;
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的handler()是,当我按Ctrl+ 时没有调用C。相反,循环不再等待用户输入,如下所示:
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:
Run Code Online (Sandbox Code Playgroud)
如果重要的话,我在Windows上,并且我知道有Windows特定的捕获Ctrl+ 方式,C但是我想尽可能使用boost来简化移植。
以io_service对象为中心提升ASIO,您请求的所有任务(尤其是异步任务)通常由来处理io_service。
通过做:
// Start an asynchronous wait for one of the signals to occur.
signals.async_wait( handler );
Run Code Online (Sandbox Code Playgroud)
您需要服务异步等待信号并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();
}
Run Code Online (Sandbox Code Playgroud)
然后按即可Ctrl + C完成您的期望。
请注意,io_service基本上替换了无限循环,因此您在其中执行的所有操作都应成为的任务io_service。