boost asioプログラム優雅な終了2
1074 ワード
前編はとても簡単で、分かりやすいです.ただし、C++で使用するには、複数のプロジェクトで使用できるコードにカプセル化する必要があります.
次に、グローバル変数をキャンセルして、run関数を提供するサーバクラスを作成します.また、サーバオブジェクトは信号量を監視し、優雅に終了します.
プログラムを実行し、killコマンドでプロセスを殺します.その結果,xが表示されるとプログラムは終了する.
次に、グローバル変数をキャンセルして、run関数を提供するサーバクラスを作成します.また、サーバオブジェクトは信号量を監視し、優雅に終了します.
#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が表示されるとプログラムは終了する.