zoukankan      html  css  js  c++  java
  • 关于read函数的一些分析

     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,所以用continue
    11                 continue;
    12             else if (errno == EAGAIN)//表示没有数据可读,在ET边缘触发方式下,要求我们做到读无可读
    13             {
    14                 return readSum;
    15             }  
    16             else
    17             {
    18                 perror("read error");
    19                 return -1;
    20             }
    21         }
    22         else if (nread == 0)
    23         {
    24             //printf("redsum = %d
    ", 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为正在断开状态

  • 相关阅读:
    chrome浏览器(block)屏蔽http文件下载,如何解除?
    node项目无法编译
    Google的60款开源项目
    王兴:真正的高手,都在苦练基本功
    Flink SQL 写 hudi
    Python3 bytes函数
    Python中Base64编码与解码
    Python 类的__setitem__(),__getitem()__,__delitem__()方法
    Python queue(队列)
    Ubuntu20.04设置远程桌面连接
  • 原文地址:https://www.cnblogs.com/AKUN-FYK/p/10935479.html
Copyright © 2011-2022 走看看