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 不会忽略信号的主要内容,如果未能解决你的问题,请参考以下文章