zmq_poll在从stdin读取时没有监听信号

时间:2018-04-10 10:27:29

标签: c++ signals zeromq polling

我在Linux上使用 zmq_poll ,在我的C ++应用程序中,通过从控制台输入读取来进行轮询。现在我没有使用任何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的工作方式中误解了某些内容?

这可能与信号屏蔽有关吗?

注意:我在从main生成的单独线程中调用zmq_poll。 我直接使用'poll'进行了测试,得到了相同的结果。只有在主线程中调用'poll'时才能看到传递的信号;如果在一个单独的线程上调用它就没有反应。

1 个答案:

答案 0 :(得分:1)

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

是的,在 ZMQ_STREAM 可扩展形式通信模式原型下扩展使用O / S本机TCP对等体成为可能,但这些步骤开始出现期望不一致的问题-v / s-reality交付。

本地O / S文件描述符可能会被强制注入.fd zmq_pollitems_t struct 项目(s),然而 EINTR 信号被提升为ZeroMQ - Socket() - 传播O / S信号时的实例,这似乎对“注入“ - 只有民意调查。

如果同样的差异仍然存在“完整”设置(使用完全配置并设置 ZMQ_STREAM - Socket() - 实例,而不仅仅是ad-hoc, .fd - “注入” - 通常技巧)轮询,最好提出对包维护者的更改请求,以便将处理重构为两种类型的轮询设备的Zen-of-Zero统一模式。