Firefox Android php wordpress HTML5 开源 nginx apache linux shell centos Ubuntu google Windows Python java linux命令 微软 程序员 mysql

使用poll机制处理多连接

   poll函数提供与select函数类似的功能,解决了select函数存在的一些问题,并且函数调用方式也更加简单,函数定义如下:
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/select.h>
   与select函数分别监控不同类型操作的文件句柄不同,poll函数使用pollfd类型的结构来监控一组文件句柄,参数ufds是要监控的文件句柄符合,nfds是监控的文件句柄数量,tinmeout参数指定等待的毫米数,无论I/O 是否准备好,nfds是监控的文件句柄数量,timeout为0表示poll调用立即返回并列出准备好I/O的文件描述符,但并不等待其他的事件,成功时,poll函数返回结构体中的revents域不为0的文件描述符个数,如果在超时前都没有任何事件发生,poll函数返回0,失败时,poll函数返回-1,与poll函数相关的pollfd结构定义如下:
if(receivedMessages.empty() == false)
       
 {
            FD_ZERO(&writeSet);
            for(mapIt = receivedMessages.begin();
           
     mapIt != receivedMessages.end(); mapIt ++)
           
     FD_SET(mapIt->first, &writeSet);
         
   select(getMapMax(receivedMessages) + 1, NULL, &writeSet, NULL, NULL);
    
   for(mapIt = receivedMessages.begin();
          
   mapIt != receivedMessages.end(); mapIt ++)

  pollfd结构中定义了一个需要监控的文件描述符以及监控的事件。可以向poll函数传递一个poll结构的数组,用于监控多个文件描述符。pollfd结构中,events结构中的成员数量是监控事件描述符的掩码,用户通过系统提供的函数设置需要监控事件对应的掩码比特位。revents成员变量是文件描述监控事件的返回掩码,内核在监控到某个文件描述符指定事件后对应设置的比特位。用户程序可以通过判断对应的事件比特位确定被监控事件是否返回。
  需要注意的是,在每次使用了poll函数和select函数不一样,不需要显示的请求异常情况的最新报告。POLLIN | POLLPRI等价于select()的读事件,POLLOUT |POLLWRBAND等价于select()的写事件。POLLIN等价于POLLRDNORM |POLLRDBAND,而POLLOUT则等价于POLLWRNORM。 
例如,要同时监视一个文件描述符是否可读和可写,我们可以设置 events为POLLIN |POLLOUT。在poll返回时,我们可以检查revents中的标志,对应于文件描述符请求的events结构体。如果POLLIN事件被设置,则文件描述符可以被读取而不阻塞。如果POLLOUT被设置,则文件描述符可以写入而不导致阻塞。这些标志并不是互斥的:它们可能被同时设置,表示这个文件描述符的读取和写入操作都会正常返回而不阻塞。

timeout参数指定等待的毫秒数,无论I/O是否准备好,poll都会返回。timeout指定为负数值表示无限超时;timeout为0指示poll调用立即返回并列出准备好I/O的文件描述符,但并不等待其它的事件。这种情况下,poll()就像它的名字那样,一旦选举出来,立即返回。

延伸阅读

  • 抱歉,暂无相关内容!

评论