關於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模式會用的這個)