在非阻塞模式下當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事件的訊息函式,然後在...