Timer zmqèU民意测验在细节方面如何运作?在哪些情况下我需要它?
api非常模糊,所以我想在这里问一下,zmq_民意测验是如何工作的 假设我们有以下代码:Timer zmqèU民意测验在细节方面如何运作?在哪些情况下我需要它?,timer,zeromq,polling,Timer,Zeromq,Polling,api非常模糊,所以我想在这里问一下,zmq_民意测验是如何工作的 假设我们有以下代码: //set timerValue here 1: items[0].socket = server_socket; 2: items[0].events = ZMQ_POLLIN; 3: items[0].fd = timerfd_create(CLOCK_REALTIME, 0); 4: 5: timerfd_settime(items[0].fd, 0, &timerValue, NULL);
//set timerValue here
1: items[0].socket = server_socket;
2: items[0].events = ZMQ_POLLIN;
3: items[0].fd = timerfd_create(CLOCK_REALTIME, 0);
4:
5: timerfd_settime(items[0].fd, 0, &timerValue, NULL);
6:
7: zmq_poll(items, 1, -1);
8:
9: if(items[0].revents & ZMQ_POLLIN){
10: ...
11: }
假设计时器运行一分钟,然后超时。如果我们阅读这段代码,我们将设置一个套接字和文件描述符。api说:
对于每个zmq_pollitem_t项,zmq_poll()应检查套接字引用的ØMQ套接字或文件描述符fd指定的标准套接字,以查看事件中指定的事件。如果套接字和fd都设置在单个zmq_pollitem_t中,则套接字引用的ØMQ套接字应优先,fd的值应忽略。
那么zmq_poll在fd和/或socket中基本上是如何工作的呢?等待过程在哪里?我认为民意测验类似于打断(或等待?)。我对此有点困惑。大多数操作系统都有一个系统调用来有效地等待对象上的事件。在Linux上,此系统调用是
poll()
,对象是文件描述符
因为ZeroMQ套接字不是文件描述符,所以不能对ZeroMQ套接字使用poll()
。这就是为什么会有zmq\u poll()
。作为额外的奖励,zmq_poll()
允许您等待ZeroMQ套接字和文件描述符上的事件。这对许多程序都很有用。例如,如果您有一个交互式程序,您希望等待来自标准输入(即文件描述符)的ZeroMQ套接字和键盘输入上的事件
关于您的代码和问题:
有一个超时参数。没有必要自己创建计时器zmq\u poll()
- 您只能设置
的zmq\u pollitem\t
或.socket
成员,但不能同时设置两者。将另一个设置为0。如果同时设置这两个参数,ZeroMQ将忽略.fd
成员.fd
- 当您调用
时,您的程序将阻塞,直到zmq\u poll()
返回zmq\u poll()
在其中一个zmq\u poll()
s上发生事件时返回,或者在超时过期时返回zmq\u pollitem\u t
- 您可以根据需要等待任意数量的
s。这取决于你的计划。例如,服务器可能处理多个连接,您可以为每个连接创建一个zmq\u pollitem\t
zmq\u pollitem\u t
void wait_for_socket_和_fd(void*sock,int fd,长超时)
{
//等待两个对象
zmq_pollitem_t items[2];
//等待ZeroMQ套接字。。。
项目[0]。套接字=sock;
项目[0].fd=0;
项目[0]。事件=ZMQ_POLLIN;
//…然后等待fd
项[1]。套接字=NULL;
项目[1].fd=fd;
项目[1]。事件=ZMQ_POLLIN;
//阻止,直到事件发生或超时过期
int ret=zmq_poll(items,sizeof(items)/sizeof(items[0]),超时;
如果(ret>0)
{
//事件发生
如果(项目[0]。复仇!=0)
{
//事件发生在sock上,请处理它
}
如果(项目[1]。复仇!=0)
{
//事件发生在fd上,请处理它
}
}
else if(ret==0)
{
//超时过期了,做点什么
}
其他的
{
//发生错误,请处理它
}
}
它允许等待套接字和文件描述符,但我必须设置.socket或.fd。我怎么能理解呢?我想如果我设置.socket,它只能接受套接字事件,如果我设置.fd,它只能接受fds。那么,为什么我必须在zmq_pollitem_t中选择套接字和fd呢?我应该什么时候设置.socket和.fd?