c++ - 从 stdin 读取时 zmq_poll 不监听信号

标签 c++ signals zeromq polling

在我的 C++ 应用程序中,我在 Linux 上使用对 zmq_poll 的调用,以从控制台输入的读取中进行轮询。现在我没有使用任何 ZeroMQ 套接字,但我会在未来使用。

据我了解 zmq_poll 只有在 Linux 上可以使用 linux 文件描述符,包括 STDIN_FILENO

当我向我的应用程序发送 CTRL-C 时,我希望下面的代码返回一个 EINTR

当我调试它时,我可以看到它一直在等待直到超时结束并返回 res_num=0

   zmq_pollitem_t* mpPollItems = new zmq_pollitem_t[1];
   std::memset(mpPollItems,0,sizeof(zmq_pollitem_t));

    mpPollItems[0].socket = NULL;
    mpPollItems[0].fd = STDIN_FILENO;
    mpPollItems[0].events = ZMQ_POLLIN;

    // Poll for events some milliseconds
    int res_num = zmq_poll (mpPollItems, 1, 10000);

zmq_poll 在幕后使用 linux“轮询”。

我是不是在这段代码中做错了什么,还是我误解了 zmq_poll 的工作方式?

会不会与信号屏蔽有关?

注意:我在从主线程生成的单独线程中调用 zmq_poll。 我直接使用“民意调查”进行了测试,得到了相同的结果。只有在主线程中调用“轮询”时,我才能看到传递的信号;如果在单独的线程上调用它,则不会有任何反应。

最佳答案

最近的 ZeroMQ API 扩展带来了一些“肮脏”的技巧,超出原始Zen-of-ZERO

是的,在 ZMQ_STREAM 可扩展正式通信模式原型(prototype)下扩展使用 O/S-native TCP-peers 成为可能,但这些步骤开始出现问题交付的期望与现实不一致。

native O/S 文件描述符可能会强制注入(inject)到 zmq_pollitems_t .fd 项中>struct(s),但是 EINTR 信号在 ZeroMQ-Socket()-instances传播的 O/S 信号,对于“注入(inject)的”仅轮询,它的工作方式似乎不同。

如果同样的差异仍然存在,“完整”设置(使用完全配置和设置的 ZMQ_STREAM-Socket()-instance ,不仅仅是临时的,.fd-“注入(inject)”-only 技巧)轮询,最好向包维护者提出更改请求,以便将处理重构回 Zen-of -两种轮询设备的零统一模式。

关于c++ - 从 stdin 读取时 zmq_poll 不监听信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49751270/

相关文章:

c++ - 初始化 union 内的结构 (C++)

C++ 将包含二进制数据的 std::string 转换为 char*

audio - 音频音乐可视化器使用什么组件

sockets - PyZMQ ( ZeroMQ ) - 如何从 SUB-socket 获取订阅 key ?

erlang - "Erlang"与 "zeromq+any language"的嵌入式应用

zeromq - 没有 PULLer 的 ZMQ PUSHer

c++ - 将否定的 double 转换为 int

c++ - 使用 QNetworkAccessManager 的 Qt 控制台应用程序

c - 创建线程,然后所有线程在临界区之前退出

search - 搜索音频