gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 05:46:57 32 4
gpt4 key购买 nike

注意: 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/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com