封裝非阻塞模式下的read,write函式

2021-06-09 18:16:54 字數 1617 閱讀 3284

在非阻塞模式下當read讀完fd中所有內容後將返回-1,並且errno設定為eagain

read函式說明

read()會把引數fd 所指的檔案傳送count個位元組到buf指標所指的記憶體中。

若引數count為0,則read為實際讀取到的位元組數,

如果返回0,表示已到達檔案尾或是無可讀取的資料

但在o_nonblock模式下,無資料將返回-1

eintr 此呼叫被訊號所中斷。   

eagain 當使用不可阻斷i/o 時(o_nonblock),若無資料可讀取則返回此值。(這個就是為什麼使用自己寫的read函式出錯原因)

自己改進的封裝函式

int my_read(int fd, char *buf, int count)

else if(errno == eintr)

else

}  

else if(nread == 0)

totlen += nread;

buf += nread;

}  

return totlen;

}分析原因:

封裝的read

呼叫read(fd, buf, sizeof(buf)), 一般這個sizeof(buf)都比較大

int read(int fd, char *buf, int count)

return totlen;

}fd設定的是o_nonblock,第二次迴圈時無資料可讀,nread返回-1, 結果函式執行失敗

網上一般的封裝函式

ssize_t read(int fd,void *buf,size_t nbyte)

read函式是負責從fd中讀取內容.當讀成功時,read返回實際所讀的位元組數,如果返回的值是0 表示已經讀到檔案的結束了,

小於0表示出現了錯誤.如果錯誤為eintr說明讀是由中斷引起的, 如果是econnrest表示網路連線出了問題.

ssize_t  my_read(int fd, char *buffer, int length)

else if(bytes_read==0)

break;

bytes_left-=bytes_read;

ptr+=bytes_read;

} return(length-bytes_left);

} 道理類似,但也沒有處理o_nonblock這種情況

另外常用的設定非阻塞模式函式

int setnonblock(int fd)

flags |= o_nonblock;

if(fcntl(fd, f_setfl, flags) < 0)

return 0;

}封裝性不是很好,還是apue的比較給力

static int set_fl(int fd, int flags)

val |= flags;

if(fcntl(fd, f_setfl, val) < 0)

return 0;

}static int clr_fl(int fd, int flags)

val &= ~flags;

if(fcntl(fd, f_setfl, val) < 0)

return 0;

}

Linux下socket阻塞模式與非阻塞模式

1 阻塞模式與非阻塞模式下recv的返回值各代表什麼意思?有沒有區別?就我目前了解阻塞與非阻塞recv返回值沒有區分,都是 0 出錯,0 連線關閉,0接收到資料大小,特別 返回值 0時並且 errno eintr errno ewouldblock errno eagain 的情況下認為連線是正常的...

阻塞模式和非阻塞模式

好文得轉 何為阻塞?在以上過程中若連線還沒到來,那麼 accept 會阻塞 程式執行到這裡不得不掛起,cpu 轉而執行其他執行緒。在以上過程中若資料還沒準備好,read 會一樣也會阻塞。阻塞式網路 io 的特點 多執行緒處理多個連線。每個執行緒擁有自己的棧空間並且占用一些 cpu 時間。每個執行緒遇...

非阻塞模式

非阻塞模式是指利用socket事件的訊息機制,server端與client端之間的通訊處於非同步狀態。在非阻塞模式下利用socket事件的訊息機制,server端與client端之間的通訊處於非同步狀態下。通常需要從csocket類派生乙個新類,派生新類的目的是過載socket事件的訊息函式,然後在...