名称
zmq_poll - 输入/输出多路复用
提要
int zmq_poll (zmq_pollitem_t '*items', int 'nitems', long 'timeout');
描述
zmq_poll() 函数提供了一种机制,供应用程序以水平触发方式在套接字集合上多路复用输入/输出事件。'items' 参数指向的数组的每个成员都是一个 zmq_pollitem_t 结构体。'nitems' 参数指定了 'items' 数组中的项数。zmq_pollitem_t 结构体的定义如下:
typedef struct { void '*socket'; zmq_fd_t 'fd'; short 'events'; short 'revents'; } zmq_pollitem_t;
对于每个 zmq_pollitem_t 项,zmq_poll() 将检查由 'socket' 引用的 0MQ 套接字**或**由文件描述符 'fd' 指定的标准套接字,以查找在 'events' 中指定的事件。如果在单个 zmq_pollitem_t 中同时设置了 'socket' 和 'fd',则以 'socket' 引用的 0MQ 套接字为准,并忽略 'fd' 的值。
对于每个 zmq_pollitem_t 项,zmq_poll() 将首先清除 'revents' 成员,然后通过设置 'revents' 成员中与事件条件对应的位来指示发生的任何请求的事件。
如果在任何 zmq_pollitem_t 项上都没有发生请求的事件,zmq_poll() 将等待 'timeout' 毫秒,直到在任何请求的项上发生事件。如果 'timeout' 的值为 0
,zmq_poll() 将立即返回。如果 'timeout' 的值为 -1
,zmq_poll() 将无限期地阻塞,直到在至少一个 zmq_pollitem_t 上发生请求的事件。
zmq_pollitem_t 的 'events' 和 'revents' 成员是通过将以下事件标志组合进行按位或运算构建的位掩码:
- ZMQ_POLLIN
-
对于 0MQ 套接字,至少可以从 'socket' 接收一条消息而不会阻塞。对于标准套接字,这等同于 poll() 系统调用的 'POLLIN' 标志,通常意味着可以从 'fd' 读取至少一个字节的数据而不会阻塞。
- ZMQ_POLLOUT
-
对于 0MQ 套接字,至少可以向 'socket' 发送一条消息而不会阻塞。对于标准套接字,这等同于 poll() 系统调用的 'POLLOUT' 标志,通常意味着可以向 'fd' 写入至少一个字节的数据而不会阻塞。
- ZMQ_POLLERR
-
对于标准套接字,此标志通过 zmq_poll() 传递到底层 poll() 系统调用,通常意味着由 'fd' 指定的套接字上存在某种错误条件。对于 0MQ 套接字,如果在 'events' 中设置此标志则无效,并且 zmq_poll() 永远不会在 'revents' 中返回此标志。
- ZMQ_POLLPRI
-
对于 0MQ 套接字,此标志无用。对于标准套接字,这意味着有紧急数据可读。有关更多信息,请参阅 POLLPRI 标志。对于文件描述符,请参阅您的用例:例如,GPIO 中断通过 POLLPRI 事件发出信号。此标志在 Windows 上无效。
注意
|
zmq_poll() 函数可以使用 poll() 以外的操作系统接口实现或模拟,因此可能会受到这些接口的限制,而这些限制在本文档中未定义。 |
线程安全
zmq_pollitem_t 数组只能由将要/正在调用 zmq_poll 的线程使用。
如果一个套接字包含在多个 zmq_pollitem_t 数组中,并且每个数组由不同的线程拥有,则该套接字本身需要是线程安全的(如 Server, Client 等)。否则,行为是未定义的。
返回值
成功完成后,zmq_poll() 函数应返回在 'revents' 中指示了事件的 zmq_pollitem_t 结构体数量;如果没有指示事件,则返回 0
。失败时,zmq_poll() 应返回 -1
并将 'errno' 设置为下面定义的一个值。
错误
- ETERM
-
'items' 数组中的至少一个成员引用了一个套接字,该套接字关联的 0MQ 上下文已终止。
- EFAULT
-
提供的 'items' 无效 (NULL)。
- EINTR
-
操作在任何事件可用之前被信号传递中断。
示例
zmq_pollitem_t items [2]; /* First item refers to 0MQ socket 'socket' */ items[0].socket = socket; items[0].events = ZMQ_POLLIN; /* Second item refers to standard socket 'fd' */ items[1].socket = NULL; items[1].fd = fd; items[1].events = ZMQ_POLLIN; /* Poll for events indefinitely */ int rc = zmq_poll (items, 2, -1); assert (rc >= 0); /* Returned events will be stored in items[].revents */
另请参阅
您的操作系统关于 poll() 系统调用的文档。
作者
此页面由 0MQ 社区编写。要进行更改,请阅读 0MQ 贡献策略,地址为 https://zeromq.cn/how-to-contribute/。