c++ - ZeroMQ:如何对 EINTR 上的不同信号类型使用react

标签 c++ signals zeromq

注意: 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++ 异常的交互:

  • POSIX 信号与 C++ 异常处理无关。
  • zmq::error_t 是由 zmq::poll() 生成的 C++ 异常,作为系统调用返回 EINTR 的结果。

TL;DR 回答:不,没有更清洁的方法。

libzmq 似乎没有安装自己的信号处理程序,但它会抛出包含 EINTRzmq::error_t系统调用中断(即 poll() 返回 -1,errno 复制到 zmq::error_t 异常中。)这可能意味着可能已经传递了 POSIX 信号并运行特定于进程的处理程序,但还有其他原因。

POSIX/Unix/Linux/BSD signal() 是一种操作系统工具,指示内核中发生异常情况。进程可以选择安装自己的处理程序以从这种情况中恢复,例如,SIGINTSIGQUIT 处理程序来关闭文件描述符、执行各种类型的清理等。这些处理程序绝不与 C++ 异常处理相关。

其他注意事项:不要从 POSIX/Unix/Linux/BSD 信号处理程序中抛出 C++ 异常。这是之前讨论过的 in this SO topic .

关于c++ - ZeroMQ:如何对 EINTR 上的不同信号类型使用react,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36040547/

相关文章:

c++ - 使用 c++ api 更改 qpid 协议(protocol)版本号

c++ - 如何使用 getline 在 C++ 中用逗号 * 和 * <space> 分隔?

c++ - 单处理器上的其他线程是否可以看到内存重新排序?

c++ - OpenSSL 和信号

c - 当我按下键 a 时将传递什么值

c++ - 我可以在仅支持 2.1 的卡中对 OpenGL4+ 进行编程吗?

c++ - 如何创建进程并让它们执行不同的分配任务,例如使用 fork 从文件读取或写入文件

sockets - 如何在ZeroMQ套接字中检索和存储随机UUID?

c++ - 将 zmq::proxy 与 REQ/REP 模式结合使用

node.js - ZMQ套接字队列