poll和select实现功能差不多,但poll效率比select效率高。
一、什么是I/O Multiplexing
I / O多路转接(I/O multiplexing),其基本思想是:先构造一张有关描述符的表,然后调用一个函数,它要到这些描述符中的一个已准备好进行 I / O时才返回。
在返回时,它告诉进程哪一个描述符已准备好可以进行 I / O。
IO multiplexing就是我们说的select,poll,epoll,有些地方也称这种IO方式为event driven IO。其好处就在于单个process就可以同时处理多个网络连接的IO。
poll的机制与select类似,与select在本质上没有多大差别,管理多个描述符也是进行轮询,根据描述符的状态进行处理,但是poll没有最大文件描述符数量的限制。poll和select同样存在一个缺点就是,包含大量文件描述符的数组被整体复制于用户态和内核的地址空间之间,而不论这些文件描述符是否就绪,它的开销随着文件描述符数量的增加而线性增大。
二、poll函数
|
|
- timeout == INFTIM 永远等待(INFTIM 通常等于-1)
- timeout == 0 不等待
- timeout > 0 等待ttimeout毫秒
与select不同,poll不是为每个条件构造一个描述符集,而是构造一个pollfd结构数组,每个数组元素指定一个描述符编号以及对其所关心的条件。
|
|
简单点儿说,fd对应要监视的文件描述符,events对应需要监视的事件,revents对应实际发生的事件。
返回值和错误代码:
- 成功时,poll()返回结构体中revents域不为0的文件描述符个数
- 如果在超时前没有任何事件发生,poll()返回0;
- 失败时,poll()返回-1,并设置errno为下列值之一:
- EBADF 一个或多个结构体中指定的文件描述符无效。
- EFAULTfds 指针指向的地址超出进程的地址空间。
- EINTR 请求的事件之前产生一个信号,调用可以重新发起。
- EINVALnfds 参数超出PLIMIT_NOFILE值。
三、利用poll设计的web服务器
设计一个比较简单的web服务器:
|
|