read的返回值結論(針對於普通文件描述符和管道或socket文件描述符狀況劃分)

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

相關文章
相關標籤/搜索