系列文章目录:C++ asio网络编程-CSDN博客
前面我们实现的服务器都是把黑框叉掉强行关闭,这种方式显然是不够优雅的,可能还有未处理的逻辑节点。所以本节通过捕获信号的方式让服务器安全退出。
int main() {
try {
boost::asio::io_context ioc;
boost::asio::signal_set signals(ioc, SIGINT, SIGTERM);
signals.async_wait([&ioc](auto, auto) {
ioc.stop();
});
Server s(ioc, 10086);
ioc.run();
}
catch (std::exception& e) {
std::cerr << "Exception: " << e.what() << std::endl;
}
return 0;
}
signal_set
是 Boost.Asio 提供的一个类,用于处理系统信号。- 这里的
signals
对象监听两个信号:SIGINT
(通常由 Ctrl+C 触发)和SIGTERM
(终止信号)。当这些信号中的任何一个被触发时,程序将执行与信号相关的回调函数 async_wait
方法用于异步等待信号的触发。它接受一个回调函数,当信号触发时,该回调函数会被调用。- 回调函数是一个 lambda 表达式,它捕获了
ioc
引用(&ioc
),并在信号触发时调用ioc.stop()
,这将停止io_context
的事件循环,从而安全地终止程序。