boost::asio::system_timer 不会忽略信号
Posted
技术标签:
【中文标题】boost::asio::system_timer 不会忽略信号【英文标题】:boost::asio::system_timer doesn't ignore signals 【发布时间】:2021-02-25 14:49:59 【问题描述】:我有一个计时器代码,它使用boost::asio::system_timer
对象来执行一些操作:
boost::asio::io_context timer_context;
boost::asio::signal_set term_signals(timer_context, SIGINT, SIGTERM);
term_signals.async_wait(exit_signal_handler);
boost::asio::system_timer timer(timer_context);
while(!exit_program)
auto expiration_time =
std::chrono::duration_cast< std::chrono::seconds >(
std::chrono::system_clock::now().time_since_epoch());
expiration_time =
expiration_time - (expiration_time % std::chrono::seconds(30));
expiration_time += std::chrono::seconds(30);
auto tp = std::chrono::time_point< std::chrono::system_clock >(
std::chrono::duration(expiration_time));
timer.expires_at(tp);
timer.wait();
<do some stuff>
但是当我向程序发送SIGINT
时,wait()
会拦截它并抛出interrupted system call
异常。
有没有办法让计时器忽略信号或让它使用预定义的处理程序?
【问题讨论】:
【参考方案1】:没有预定义的处理程序来执行此操作。但是手动操作应该不会那么难。而不是调用普通的wait()
在循环中执行此操作:
boost::asio::io_context timer_context;
boost::asio::signal_set term_signals(timer_context, SIGINT, SIGTERM);
term_signals.async_wait(exit_signal_handler);
boost::asio::system_timer timer(timer_context);
while(!exit_program)
auto expiration_time =
std::chrono::duration_cast< std::chrono::seconds >(
std::chrono::system_clock::now().time_since_epoch());
expiration_time =
expiration_time - (expiration_time % std::chrono::seconds(30));
expiration_time += std::chrono::seconds(30);
auto tp = std::chrono::time_point< std::chrono::system_clock >(
std::chrono::duration(expiration_time));
timer.expires_at(tp);
auto e = boost::system::error_code;
do
timer.wait(e);
while (e == boost::asio::error::interrupted);
if (e)
//<handle non-interrupted error>
//<do some stuff>
【讨论】:
以上是关于boost::asio::system_timer 不会忽略信号的主要内容,如果未能解决你的问题,请参考以下文章