简述
zmq_poll()函数为应用程序提供了一种机制,可以基于一组sockets来实现多路的输入/输出事件。 下面是函数的定义,第一个参数是一个指针,指向一个结构体数组。nitems指定了结构体数组中元素的个数,
int zmq_poll(zmq_pollitem_t *items, int nitems, long timeout);
zmq_pollitem_t结构体定义如下
typedef struct
{
void //*sockets//;
int //fd//;
short //events//;
short //revents//;
} zmq_pollitem_t;
zmq_poll函数检测zmq socket或者fd定义的标准socket上发生的事件events,如果同时设置了sockets和fd,这时候fd会被忽略掉。
对于每一个zmq_pollitem_t,zmq_poll()函数会首先清除revents成员,如果检测到发生了任何的事件请求,会给revents置上相应的bit mask。
如果zmq_poll函数没有检测到任何事件,那么会在等待timeout毫秒后超时,函数返回;如果timeout设置成0,那么zmq_poll函数会立即返回;如果timtout设置成-1,那么zmq_poll函数会一直阻塞检测事件。
events和revents是一个bit mask,可以由以下的标识位标识
- ZMQ_POLLIN:接收消息(zmq socket)或者字节(fd)
- ZMQ_POLLOUT:发送消息(zmq socket)或者字节(fd)
- ZMQ_POLLERR:对于zmq socket,这个标志没有用;对于普通sockets,这个标志会传递给系统调用poll(),意味着fd定义的socket上发生了一些错误场景。
- ZMQ_POLLPRI:对于zmq socket,这个标志没有用。对于普通sockets,意味着有紧急数据要读取。
返回值
poll消息成功时,zmq_poll函数返回检测到事件请求的item个数,同时结构体zmq_pollitem_t 中的revent会置位相应的flag;如果没有任何事件,返回0;如果出错返回-1;
示例
// 定义两个 items
zmq_pollitem_t items [2];
/* 第一个item设置为 ØMQ socket */
items[0].socket = socket;
items[0].events = ZMQ_POLLIN;
/* 第二个item设置为标准 socket 'fd' */
items[1].socket = NULL;
items[1].fd = fd;
items[1].events = ZMQ_POLLIN;
/* 轮询这些items上的事件 */
int rc = zmq_poll (items, 2, -1);
assert (rc >= 0); /* 返回的事件保存在成员变量items[].revents中 */
[REF]:
zmq官方API文档
网友评论