首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >:asio未能捕获SIGINT

:asio未能捕获SIGINT
EN

Stack Overflow用户
提问于 2018-09-28 20:41:55
回答 1查看 1K关注 0票数 1

下面的程序永远不会到达处理程序()。我正在使用信号集安装我自己的信号处理程序。

代码语言:javascript
复制
void handler( const boost::system::error_code& error , int signal_number )
{
  ROS_ERROR("inside signal handler");
  exit(1);
}
 int main( int argc , char** argv )
{
  ros::init(argc, argv, "name", ros::init_options::NoSigintHandler);
  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 );

 boost::asio::spawn(io_service, {
    while(1);
 }
);



io_service.run();
  return 0;
}

有意思,当我用

代码语言:javascript
复制
  signals.async_wait(
      [&ioSservice](boost::system::error_code& code, int signalNo) {
        ioService.stop();
      });

那它就不会终止。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-28 21:31:55

您只有一个线程为您的io_service服务,它忙于处理while(1);,因此不能运行信号处理程序。

io_service的作用类似于队列。当您对事物进行async_wait时,asio将安排将回调添加到队列中,以便通过相关的io_service运行。调用io_service::run时,调用线程将从io_service的队列中提取挂起的项并运行它们。

在本例中,当您调用io_service.run()时,队列中有任务:由spawn创建的任务,它运行着一个没完没了的while循环。由于循环从未结束,主线程永远无法完成该任务。稍后,当signal_set接收到SIGINT时,它会向队列中添加另一个作业以调用handler,但是它永远不会被运行,因为从队列中提取作业的唯一线程正忙于一个没完没了的while循环。

处理这一问题的方法是避免将长期运行的作业放在io_service的队列中和/或让多个线程为io_service服务。

代码语言:javascript
复制
void handler(const boost::system::error_code& error, int signal_number)
{
  std::cout << "inside signal handler\n";
  exit(1);
}

int main(int argc, char** argv)
{
  boost::asio::io_service io_service;

  // You can use a work object to avoid having the io_service
  // stop when its job queue empties.
  boost::asio::io_service::work work(io_service);

  boost::asio::signal_set signals(io_service, SIGINT);
  signals.async_wait(handler);

  // Now that there's a work object keeping this io_service running
  // this call isn't needed at all.  It's just here to demonstrate
  // that it works
  boost::asio::spawn(io_service, []{
      while(1);
    }
  );

  // Start a second thread to run io_service jobs
  std::thread t([&io_service]{ io_service.run(); });

  // Also handle io_service jobs on this thread
  io_service.run();
  return 0;
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52562406

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档