- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
注意: This question与我的相当接近,但我至少可以对提供的解决方案使用一些工作示例,也许 ZeroMQ
会带来一些我不知道的魔力。
目前,我在阻止 ZeroMQ
调用时对异常使用react,如下所示:
try {
zmq::poll(&items, number, timeout);
} catch (zmq::error_t &ex) {
if (ex.num() != EINTR) {
throw;
}
}
...
我的意图是:重新抛出所有捕获的异常,但那些由中断的系统调用触发的异常,我通常可以忽略(例如 SIGPROF
) 并重新启动 zmq::poll
。
在 SIGINT
(CTRL-C) 的情况下,我想以不同的方式进行(例如,也重新抛出或终止循环)。
目前我最好的选择是安装一个信号处理程序来监听 SIGINT
但由于 ZeroMQ
自己捕获信号,我会更喜欢更复杂的方法。
最佳答案
如果我没看错原发帖者的问题,@frans 会询问是否有办法重新抛出某些异常,其中 C++ 异常包含 EINTR
错误代码,但某些信号生成的异常除外。 @frans 目前有一个 SIGINT
信号处理程序,想知道是否有更简洁的方法。
提出了两个不同的问题,关于 POSIX signal()
处理及其与 C++ 异常的交互:
zmq::error_t
是由 zmq::poll()
生成的 C++ 异常,作为系统调用返回 EINTR
的结果。 TL;DR 回答:不,没有更清洁的方法。
libzmq
似乎没有安装自己的信号处理程序,但它会抛出包含 EINTR
的 zmq::error_t
系统调用中断(即 poll()
返回 -1,errno
复制到 zmq::error_t
异常中。)这可能意味着可能已经传递了 POSIX 信号并运行特定于进程的处理程序,但还有其他原因。
POSIX/Unix/Linux/BSD signal()
是一种操作系统工具,指示内核中发生异常情况。进程可以选择安装自己的处理程序以从这种情况中恢复,例如,SIGINT
和 SIGQUIT
处理程序来关闭文件描述符、执行各种类型的清理等。这些处理程序绝不与 C++ 异常处理相关。
其他注意事项:不要从 POSIX/Unix/Linux/BSD 信号处理程序中抛出 C++ 异常。这是之前讨论过的 in this SO topic .
关于c++ - ZeroMQ:如何对 EINTR 上的不同信号类型使用react,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36040547/
我是一名优秀的程序员,十分优秀!