unpv13e/lib/readn.c

#include "unp.h"

/* Read "n" bytes from a descriptor: 從套接字描述符讀取n個字節到定義好的緩衝區裏去*/
ssize_t readn(int fd, void *vptr, size_t n)
{
    size_t  nleft;    //size_t 是無符號整形,相當於unsigned int;  要讀取的字節數
    ssize_t nread;    //ssize_t是有符號整形,相當於int;  讀取到的字節數
    char *ptr = NULL;

    nleft = n;        //將要讀取的字節數給nleft;
    ptr = vptr;       //用ptr指向自己定義的緩衝區

    while(nleft > 0)  //當讀取的字節數大於0時
    {
        if( (nread = read(fd, ptr, nleft)) < 0)
        {
            if(errno == EINTR)   //EINTR在read()函數下表示:由於信號中斷,沒讀到任何數據;
                nread = 0;    //如果是被信號打斷了的話,就跳過本輪循環,在重新執行一次;
            else
                return (-1);
        }
        else if(nread == 0)
            break;
        nleft -= nread;     //nleft = nleft - nread:"要讀取的" - "已讀取的" = "未讀取的";
        ptr   += nread;     //ptr = ptr + nread:讓指針向後移動nread個字節,爲下一輪要讀取的數據挪地方,省的下次讀到的數據把這次的給覆蓋掉;
    }
    return (n - nleft);   //用要讀取的數據 - 未讀取的數據 = 以讀取的數據;
}
readn()的包裹函數(wrap fuction)

ssize_t Readn(int fd, void *ptr, size_t nbytes)
{
    ssize_t     n;

    if ( (n = readn(fd, ptr, nbytes)) < 0)
        err_sys("readn error");
    return(n);
}
發佈了51 篇原創文章 · 獲贊 27 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章