Linux网络编程12 -- select的局限和poll函数

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/YZC1078/article/details/78676790

一、select的局限性

1、最大文件描述符的局限。套接字在socket创建时,受到最大文件描述符的限制,Linux系统默认最多创建1024个套接字,且三个已被占用:标准输入、标准输出、标准错误,且服务器端还要去掉一个监听套接字listenfd。

linux系统可通过ulimit -n 查看和ulimit -n count 进行修改。

2、select进行检测时,受限于FD_SETSIZE的大小,最多只可以检测FD_SETSIZE个套接字,linux默认为1024个。

FD_SETSIZE是内核的宏定义,要修改该值,需重新编译内核。

二、poll函数

使用poll函数,poll函数没有最大值的限制,可以避免了select的FD_SETSIZE的限制

#include <poll.h>

int poll(struct pollfd fd[], nfds_t nfds, int timeout);

参数:

 1)第一个参数:一个结构数组,struct pollfd结构如下:

  struct pollfd{

  int fd;              //文件描述符

  short events;    //请求的事件

  short revents;   //返回的事件

  };

  events和revents是通过对代表各种事件的标志进行逻辑或运算构建而成的。events包括要监视的事件,poll用已经发生的事件填充revents。poll函数通过在revents中设置标志肌肤POLLHUP、POLLERR和POLLNVAL来反映相关条件的存在。不需要events中对于这些标志符相关的比特位进行设置。如果fd小于0, 则events字段被忽略,而revents被置为0.标准中没有说明如何处理文件结束。文件结束可以通过revents的标识符POLLHUN或返回0字节的常规读操作来传达。即使POLLIN或POLLRDNORM指出还有数据要读,POLLHUP也可能会被设置。因此,应该在错误检验之前处理正常的读操作。


poll函数的事件标志符值


POLLIN普通或优先级带数据可读
POLLRDNORM普通数据可读
POLLRDBAND优先级带数据可读
POLLPRI高优先级数据可读
POLLOUT普通数据可写
POLLWRNORM:普通数据可写
POLLWRBAND优先级带数据可写
POLLERR发生错误
POLLHUP发生挂起
POLLNVAL描述字不是一个打开的文件


2)第二个参数nfds:要监视的描述符的数目。
注意:后三个只能作为描述字的返回结果存储在revents中,而不能作为测试条件用于events中。

3)最后一个参数timeout:是一个用毫秒表示的时间,是指定poll在返回前没有接收事件时应该等待时间。如果  它的值为-1,poll就永远都不会超时。如果整数值为32个比特,那么最大的超时周期大约是30分钟。


INFTIM:永远等待
0:立即返回,不阻塞进程
>0:等待指定数目的毫秒数


猜你喜欢

转载自blog.csdn.net/YZC1078/article/details/78676790