Linux下C编程(3)
ltest]$ ./pollexam sdfdasdftimeout :0,0 [windriver@windriver-machine ltest]$ sdfdasdf bash: sdfdasdf: command not found [windriver@windriver-machine ltest]$ ./pollexam sfsdfdasdf ============ input string is :sfsdfdasdf [windriver@windriver-machine ltest]$ ./pollexam timeout :0,0 [windriver@windriver-machine ltest]$ cat pollexam.c #include <sys/poll.h> #include<stdio.h> #include<string.h> int main(void) struct pollfd pfds; memset(&pfds,0,sizeof(pfds)); retval= poll(&pfds,1,2*1000); poll使用事件进行返回,应用通过获取指定FD上关联的事件来进行相应的处理.常用的事件包括读事件POLLIN,写事件POLLOUT如下所示:
4)改进版I/O复用之epoll.是LINUX内核在2.6之后为处理大量客户端的socketFd而改进的poll,它也可以称之为select/poll的增强版本.虽然是增强版本,但是也是适用于特定场景下的,这个特定场景是大量并发连接中只有少量活跃的情况.在这种情况下如何避免扫描FD集合的开销和如何有效触发活跃I/O操作.这里有两个关键改进,一个相对于select时FD_SETSIZE无限制,它实际上就是LINUX能够打开的FD的最大数量,通常可以cat /porc/sys/fs/file-max来设制或用ulimit –n 来设置.epoll所支持的FD上限理论上就是最大可以打开文件的数量,也就是说如果你有1G的内存,理论上可以打开10W个FD.这一点可以极大的满足大量用户的服务器开发.另外一个相对于poll需要对保存FD集合的数据结构进行线性扫描,并返回对应的事件这种模式的改进,FD不再进行线性扫描,它只针对活跃的SOCKET进行操作,具体实现就是内核会对FD进行回调实现,只有活跃SOCKET的这些回调函数才能触发IO事件,返回给用户.因此,对一个大并发量的应用服务器,如果有很多连接,但一时时段的活跃连接并不多时,采用EPOLL效率非常高.Epoll对事件触发的方式提供了两种选择,一种是默认的LT模式,即Level trigger,适应于非阻塞和阻塞I/O,缺省.这种模式下内核会一直触发,直到事件被用户消费掉.也就是说在这种情况下FD上的数据一定被写完或者读完才不会有下一次的触发事件.而ET模式,俗称Edge trigger,边沿触发适用于非阻塞模式下,在这种模式下,当文件描述符从未就绪变为就绪时,内核通过epoll告诉你,然后内核假设你已知道文件描述符已就绪,可以进行读写.后面内核不再发送通知,只有当新的文件描述符来到时候才会发出就绪通知.因此,在这种情况下如果没有读完的FD,内核不会继续通知,进行文件读写时需要进行循环读写到EATRAN. [windriver@windriver-machine ltest]$ g epollserv.cpp -o epollserv [windriver@windriver-machine ltest]$ cat epollserv.cpp |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |