asio io_context.run () поднять сигнал operation_abort? - PullRequest
0 голосов
/ 17 марта 2020
struct S{
  S():io_context_(){}
  void Start(){
    io_context.run();
  }
  void HandleSignal(){
    asio::signal_set signals(io_context_,SIGINT,SIGTERM);
    signals.async_wait(){
      if(ec&&ec==asio::error::opeartion_aborted)std:cerr<<"Exception";
    };
  }
  io_context io_context_;
}

выполнить следующим образом:

  S s;
  s.HandleSignal();
  s.Start();

, но при вызове io_context_.run () opeation_aborted повышается. почему это случилось?

1 Ответ

1 голос
/ 17 марта 2020

Инициированная асинхронная операция c была отменена деструктором signal_set. Вот почему вы получаете operation_aborted.

Ваша signal_set является локальной переменной. Он удаляется в конце области действия HandleSignal.

Ссылка на signal_set состояния деструктора:

Эта функция уничтожает набор сигналов, отменяя любые невыполненные асинхронные операции ожидания, связанные с набором сигналов, как если бы вызывал метод cancel .

Вы можете создать signal_set в качестве члена данных, чтобы продлить срок его службы:

struct S {
  S():io_context(), signals(io_context, SIGINT, SIGTERM){}

  void Start() {
      try {
        io_context.run();
      }
      catch (std::exception& ex) {
          std::cout << "exception: " << ex.what() << std::endl;
      }
  }

  void HandleSignal() {    
    signals.async_wait( [](const boost::system::error_code& ec, int ) 
    {
        if(ec&&ec==boost::asio::error::operation_aborted)
            std::cout <<"Exception";
        else 
            std::cout << "handler fired" << std::endl;
    });
  }

  boost::asio::io_context io_context;
  boost::asio::signal_set signals;
};
...