快速业务通道

Linux下C编程(3)

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-03-24
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;
int retval;
char str[256];

memset(&pfds,0,sizeof(pfds));
pfds.fd=0;
pfds.events =POLLIN;

retval= poll(&pfds,1,2*1000);
if(pfds.revents & POLLIN){
fscanf(stdin,"%s",str);
printf("============\ninput string is :%s\n",str);
}
else {
printf("timeout :%d,%x\n",retval,pfds.revents);
}
}

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]$ ./epollserv
accept a connect from 127.0.0.1
EPOLLIN
read 12345
EPOLLIN
read 67890

[windriver@windriver-machine ltest]$ cat epollserv.cpp
#include<iostream>
#include<sys/socket.h>
#include<sys/epoll.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<fcntl.h>
#include<unistd.h>
#include<stdio.h>
#include<errno.h&

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号