我需要捕获终端调整大小的事件,为此我正在捕获(尽管欢迎其他方法)SIGWINCH具有以下内容:
std::signal(SIGWINCH, &handle_sigwinch);
我当时希望让handle_sinwinch
做类似的事情:
display_type *dt; //inited elsewhere
void handle_sinwinch(int sig) {
dt->async_redraw();
}
async_redraw
将工作发布到内部boost::asio::io_service
然后返回。因此,不应该有竞争条件;但是,std::signal
的文档似乎意味着我可以安全地操纵volatile std::sig_atomic_t
。
IE我可以设置一个标志,然后从主线程中选择它作为事件循环的一部分。
问题是这是异步的,因此没有while(true)
循环或类似的东西。循环这样一个标志的唯一方法是创建一个截止时间计时器并定期检查它。这似乎是一个真正的黑客。
所以我的问题是,我对信号的理解是否正确?任何有关如何做到这一点的见解将不胜感激。
答案 0 :(得分:2)
如果使用boost :: asio,则可以使用boost :: asio :: signal_set的async_wait()方法处理信号。使用async_wait()设置的处理程序可以执行您想要的操作,但不会在信号处理程序上下文中调用它。