关于read函数的返回值分析:socket
状况一:(读取普通文件而言)函数
01.阻塞状况ip
read函数从打开的设备或文件中读取数据。it
read/write (read和write函数会读取\n换行)pip
#include <unistd.h>文件读取
ssize_t read(int fd, void *buf, size_t count);error
函数参数:数据
n fd:文件描述符epoll
n buf:读上来的数据保存在缓冲区buf中文件
n count:buf缓冲区存放的最大字节数
函数返回值:
n >0:读取的字节数
n =0:文件读取完毕 (对于文件而言,不管文件描述符是阻塞仍是非阻塞,若是文件读取结束那么返回值都是零!)
n -1: 出错,并设置errno
errno的错误代码
EINTR 此调用被信号所中断。
EAGAIN 当使用不可阻断I/O 时(O_NONBLOCK == 非阻塞),若无数据可读取则返回此值。
EBADF 参数fd 非有效的文件描述词,或该文件已关闭。
状况二:(读pipe或者socket的缓冲区的数据,socket的缓冲区和pipe的缓冲区默认read都是阻塞的!!)
缓冲区的文件描述符是阻塞fd的状况:
n >0:读取的字节数
n =0:对端关闭,read读取的返回值是0,至关于读到文件结尾,(若是缓冲区没有被修改成非阻塞,那么缓冲区没有数据read函数会阻塞等待有数据再进行读取!)
n -1: 出错,并设置errno(若是缓冲区的文件描述符被修改成非阻塞fd的时候,返回值若是是-1,同时 error是EAGAIN,表示缓冲区为空无数据可读取。epoll函数的ET模式会用的这个)