【问题标题】:Calling functions from std::signal handler; SIGWINCH从 std::signal 处理程序调用函数;信号机
【发布时间】:2014-01-12 15:45:26
【问题描述】:

我需要捕获终端调整大小的事件,为此我正在捕获(尽管欢迎使用其他方法)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_ts。

IE 我可以设置一个标志,然后作为事件循环的一部分从主线程中获取它。

问题是这是异步的,所以没有while(true) 循环或类似的东西。遍历此类标志的唯一方法是创建一个截止时间计时器并定期检查它。这似乎是一个真正的黑客攻击。

所以我的问题是,我对信号的理解是否正确?任何如何做到这一点的见解将不胜感激。

【问题讨论】:

    标签: c++ boost signals ncurses


    【解决方案1】:

    如果你使用 boost::asio,你可以使用 boost::asio::signal_set 的 async_wait() 方法处理信号。使用 async_wait() 设置的处理程序可以做你想做的事,它不会在信号处理程序上下文中调用。

    【讨论】:

      猜你喜欢
      • 2013-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-31
      相关资源
      最近更新 更多