转载自:http://kenby.iteye.com/blog/1162853
epoll的两种模式 LT 和 ET
二者的差异在于 level-trigger 模式下只要某个 socket 处于 readable/writable 状态,无论什么时候
进行 epoll_wait 都会返回该 socket;而 edge-trigger 模式下只有某个 socket 从 unreadable 变为 readable 或从
unwritable 变为 writable 时,epoll_wait 才会返回该 socket。如下两个示意图:
从socket读数据:
往socket写数据
所以, 在epoll的ET模式下, 正确的读写方式为:
读: 只要可读, 就一直读, 直到返回0, 或者 errno = EAGAIN
写: 只要可写, 就一直写, 直到数据发送完, 或者 errno = EAGAIN
正确的读:
- n=0;
- while((nread=read(fd,buf+n,BUFSIZ-1))>0){
- n+=nread;
- }
- if(nread==-1&&errno!=EAGAIN){
- perror("readerror");
- }
正确的写:
- intnwrite,data_size=strlen(buf);
- n=data_size;
- while(n>0){
- nwrite=write(fd,buf+data_size-n,n);
- if(nwrite<n){
- if(nwrite==-1&&errno!=EAGAIN){
- perror("writeerror");
- }
- break;
- }
- n-=nwrite;
- }
延伸阅读:
1.http://www.cnblogs.com/napoleon_liu/archive/2010/07/20/1781578.html
3.http://kovyrin.net/2006/04/13/epoll-asynchronous-network-programming/