天天看點

writen 和 readn函數實作

C語言代碼

// 從描述符 fd 讀取 n 個位元組
ssize_t readn(int fd, void *vptr, size_t n)
{
    size_t nleft;
    ssize_t nread;
    char *ptr;

    ptr = vptr;
    nleft = n;
    while (nleft > ){
        if ( (nread = read(fd, ptr, nleft)) < ){
            if (errno == EINTR)
                nread = ;  //再次調用read()
            else
                return -;
        } else if (nread == )
            break;  // 檔案結束符

        nleft -= nread;
        ptr += nread;
    }
    return (n - nleft); // return >= 0
}

// 往描述符 fd 寫取 n 個位元組
ssize_t writen(int fd, const void *vptr, size_t n)
{
    size_t nleft;
    ssize_t nwritten;
    const char *ptr;

    ptr = vptr;
    nleft = n;
    while (nleft > ){
        if ( (nwritten = write(fd, ptr, nleft)) <= ){
            if (nwritten <  && errno == EINTR)
                nwritten = ; // 再次執行write()
            else 
                return -; // error
        }

        nleft -= nwritten;
        ptr += nwritten;
    }
    return n;
}