boost::asio 未能捕获 SIGINT
boost::asio fails to catch SIGINT
我的后续程序从未到达 handler()。我正在使用信号集安装自己的信号处理程序。
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;
}
有趣,当我使用
signals.async_wait(
[&ioSservice](boost::system::error_code& code, int signalNo) {
ioService.stop();
});
那么它不会终止。
您只有一个线程为您的 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
的队列 and/or 以让多个线程为 io_service
服务:
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;
}
我的后续程序从未到达 handler()。我正在使用信号集安装自己的信号处理程序。
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;
}
有趣,当我使用
signals.async_wait(
[&ioSservice](boost::system::error_code& code, int signalNo) {
ioService.stop();
});
那么它不会终止。
您只有一个线程为您的 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
的队列 and/or 以让多个线程为 io_service
服务:
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;
}