boost asio程序优雅的退出 二

时间:2022-12-18 11:39:27

前一篇非常简单,容易懂。不过用在C++中还是需要封装成可以多个项目中使用的代码。

下面将全局变量取消,创建了一个Server类,提供了run函数,同时Server对象还监听信号量,从而优雅的退出。

#include <cstdlib>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <iostream>

using namespace boost;
using namespace boost::asio;

using namespace std;




class Server {

public:
Server(io_service & s)
: io_(s), signals_(s) {
signals_.add(SIGINT);
signals_.add(SIGTERM);
#if defined(SIGQUIT)
signals_.add(SIGQUIT);
#endif
signals_.async_wait(boost::bind(&Server::stop, this));
}

void run() {
io_.run();
}

private:
void stop() {
cout << "x" << endl;
io_.stop();
}

private:
io_service& io_;
boost::asio::signal_set signals_;
};


int main(int argc, char** argv) {
io_service s;
Server server(s);
server.run();
return 0;
}

运行程序,然后用kill 命令杀掉进程。结果是显示了x后,程序退出。