博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于read函数的一些分析
阅读量:5040 次
发布时间:2019-06-12

本文共 1219 字,大约阅读时间需要 4 分钟。

1 ssize_t readn(int fd, std::string &inBuffer, bool &zero) 2 { 3     ssize_t nread = 0; 4     ssize_t readSum = 0; 5     while (true) 6     { 7         char buff[MAX_BUFF]; 8         if ((nread = read(fd, buff, MAX_BUFF)) < 0) 9         {10             if (errno == EINTR)//慢调用被系统中断时返回的错误,需要冲洗read,所以用continue11                 continue;12             else if (errno == EAGAIN)//表示没有数据可读,在ET边缘触发方式下,要求我们做到读无可读13             {14                 return readSum;15             }  16             else17             {18                 perror("read error");19                 return -1;20             }21         }22         else if (nread == 0)23         {24             //printf("redsum = %d\n", readSum);25             zero = true;26             break;27         }28         readSum += nread;29         inBuffer += std::string(buff, buff + nread);30     }31     return readSum;32 }

前提:文件描述符为非阻塞模式,epoll为ET触发方式

调用read之后,根据返回值可分为不同情况:

①nread<0 返回EINTR:该错误为慢系统调用期间进程捕捉到信号使得该系统调用被中断返回时造成的识别码,此时根据需要来重启服务

②nread<0 返回EAGAIN:如果之前已经将读缓冲区中的内容读完,此时该描述符已经变成了不可读状态,由于fd是非阻塞模式,再read就会返回EAGAIN,在ET触发方式下,可表示已经读到了末尾返回readsum

③nread=0 如果客户端关闭连接,那么收到客户的FIN将导致read函数返回0,此时应该修改http为正在断开状态

转载于:https://www.cnblogs.com/AKUN-FYK/p/10935479.html

你可能感兴趣的文章
Android 内存泄漏优化总结
查看>>
luogu4849 寻找宝藏 (cdq分治+dp)
查看>>
Spring Cloud微服务笔记(五)Feign
查看>>
C语言键盘按键列表
查看>>
Codeforces Round #374 (Div. 2)
查看>>
oracle数据类型
查看>>
socket
查看>>
Vue中使用key的作用
查看>>
二叉索引树 树状数组
查看>>
日志框架--(一)基础篇
查看>>
Java设计模式之原型模式
查看>>
Spring学习(四)-----Spring Bean引用同xml和不同xml bean的例子
查看>>
哲理故事与管理之道(20)-用危机激励下属
查看>>
关于源程序到可运行程序的过程
查看>>
wepy的使用
查看>>
N3292系列资料之RTC介绍
查看>>
System.ValueTuple 未定義或匯入預先定義的類型
查看>>
Redhat6.4安装Oracle 11gr2 64位 注意事项
查看>>
rpm
查看>>
Finance_books_LTCM
查看>>