我在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'时才能看到传递的信号;如果在一个单独的线程上调用它就没有反应。
答案 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统一模式。