如果read()讀到數據為0,那么就表示文件讀完了,如果在讀的過程中遇到了中斷則read()應該返回-1,同時置errno為EINTR。
因此判斷read的條件如下:
if <=0
{
if==0
{
表示文件結束, 處理
}
if(<0 && errno==EINTR)
{
表示中斷,處理
}
else
{
否則,出錯
}
}
如果 write()返回0,那么就表示出錯,也就是無法寫入了;而如果在寫的過程中遇到了中斷,那么write()會返回-1,同時置errno為EINTR。
因此判斷write的條件如下:
if<=0
{
if<0
{
if errno==EINTR
那么重試
else
錯誤處理
}
if ==0
break;
}
ssize_t readn ( int fd, void *vptr, size_t n )
{
size_t nleft;
ssize_t nread;
char *ptr;
ptr=vptr;
nleft=n;
while ( nleft>0 )
{
if ( ( nread = read ( fd,ptr,nleft ) ) < 0 )
{
if ( errno == EINTR )
nread = 0;
else
return ( -1 );
}
nleft-=nread;
ptr+=nread;
}
return ( n-nleft );
}
ssize_t writen ( int fd, const void *ptr, size_t n )
{
size_t nleft;
ssize_t nwritten;
const char *ptr;
ptr=vptr;
nleft=n;
while ( nleft>0 )
{
if( ( nwritten=write( fd, ptr, nleft ) )<=0 )
{
if( nwritten<0 && errno == EINTR )
nwritten = 0;
else
return (-1);
}
nleft-=nwritten;
ptr+=nwritten;
}
return (n);
}
寫函數write
ssize_t write(int fd,const void *buf,size_t nbytes)
write函數將buf中的nbytes字節內容寫入文件描述符fd。成功時返回寫的字節數,失敗時返回-1,並設置errno變量。
在網絡程序中,當我們向套接字文件描述符寫時有倆種可能:
1) write的返回值大於0,表示寫了部分或者是全部的數據;
2) 返回的值小於0,此時出現了錯誤,我們要根據錯誤類型來處理。
如果錯誤為EINTR表示在寫的時候出現了中斷錯誤。如果為EPIPE表示網絡連接出現了問題(對方已經關閉了連接)。
讀函數read
ssize_t read(int fd,void *buf,size_t nbyte)
read函數是負責從fd中讀取內容。當讀成功時,read返回實際所讀的字節數。如果返回的值是0,表示已經讀到文件的結束了。小於0表示出現了錯誤。如果錯誤為EINTR說明讀是由中斷引起的,如果是ECONNREST表示網絡連接出了問題。