Timer zmqèU民意测验在细节方面如何运作?在哪些情况下我需要它?

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);

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);
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的值应忽略。

  • 如果我设置套接字和文件描述符,这到底意味着什么?它主要是等待套接字,客户端发送消息,如果没有得到任何事件,它会等待计时器吗

  • 如果我们调用第7行,它是否会在第7行等待,直到计时器启动或收到事件?或者我必须实现一个while(1)循环来检查第9行中的if语句吗

  • 在哪些情况下,您需要多个项目?(如果要设置多个计时器?)


  • 那么zmq_poll在fd和/或socket中基本上是如何工作的呢?等待过程在哪里?我认为民意测验类似于打断(或等待?)。我对此有点困惑。

    大多数操作系统都有一个系统调用来有效地等待对象上的事件。在Linux上,此系统调用是
    poll()
    ,对象是文件描述符

    因为ZeroMQ套接字不是文件描述符,所以不能对ZeroMQ套接字使用
    poll()
    。这就是为什么会有
    zmq\u poll()
    。作为额外的奖励,
    zmq_poll()
    允许您等待ZeroMQ套接字和文件描述符上的事件。这对许多程序都很有用。例如,如果您有一个交互式程序,您希望等待来自标准输入(即文件描述符)的ZeroMQ套接字键盘输入上的事件

    关于您的代码和问题:

    • zmq\u poll()
      有一个超时参数。没有必要自己创建计时器
    • 您只能设置
      zmq\u pollitem\t
      .socket
      .fd
      成员,但不能同时设置两者。将另一个设置为0。如果同时设置这两个参数,ZeroMQ将忽略
      .fd
      成员
    • 当您调用
      zmq\u poll()
      时,您的程序将阻塞,直到
      zmq\u poll()
      返回
      zmq\u poll()
      在其中一个
      zmq\u pollitem\u t
      s上发生事件时返回,或者在超时过期时返回
    • 您可以根据需要等待任意数量的
      zmq\u pollitem\t
      s。这取决于你的计划。例如,服务器可能处理多个连接,您可以为每个连接创建一个
      zmq\u pollitem\u t
    下面的示例代码等待ZeroMQ套接字和文件描述符

    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?