UNP-多路复用-poll

Poll

select有个致命的缺点,所支持的文件描述符个数有限,linux系统中默认最大值1024。

poll突破了文件描述符的限制

//第一个参数是一个pollfd数组
struct pollfd {      
      /*
      *#define POLLIN 0x0001 /* any readable data available */
      *#define POLLPRI 0x0002 /* OOB/Urgent readable data */
      *#define POLLOUT 0x0004 /* file descriptor is writeable */
      */
    int    fd;       /* file descriptor,当其为负数时,被内核忽略 */
    short  events;   /* events to look for */
    short  revents;  /* events returned */
};
//第二个参数nfds描述数组fds的大小,就是向poll申请的事件检测个数
//第三个参数:case <0:事件发生前永远等待。 case =0:不阻塞进程,立即返回。case >0:等待指定时间返回。
return:若有就绪描述符则为其数目,若超时则为0,若出错则为-1
int poll(struct pollfd *fds, unsigned long nfds, int timeout);  

和select有个很大的不同在于,poll不会修改传入值,而是将结果保留在revents字段中。

和 select 函数对比一下,我们发现 poll 函数和 select 不一样的地方就是,在 select 里面,文件描述符的个数已经随着 fd_set 的实现而固定,没有办法对此进行配置;而在 poll 函数里,我们可以控制 pollfd 结构的数组大小,这意味着我们可以突破原来 select 函数最大描述符的限制,在这种情况下,应用程序调用者需要分配 pollfd 数组并通知 poll 函数该数组的大小。

posted @ 2020-05-06 15:29  傻蜗牛  阅读(91)  评论(0)    收藏  举报