UNIX(编程-高级IO):09---自定义函数读写函数(readn、writen)

  • 这两个函数是自己实现的,不是系统自带的

一、引入

管道,FIFO以及某些设备(特别是终端和网络)具有以下两种性质:

  • 一次read操作所返回的数据可能少于所要求的数据,即使还没达到文件尾端。这不是 一个错误,应当继续读该设备
  • 一次write操作的返回值也可能少于指定输出的字节数。这可能是由若干因素造成的, 例如,内核输出缓冲区变满。这也不是错误,应当继续写余下的数据至该设备。(通常, 只有对非阻塞描述符,或捕捉到一个信号时,才发生这种write返回)

在读、写磁盘文件时没有这两种性质,除非文件系统用完了空间,或者接近了配额限制,不能将要求写的数据全部写出

二、函数引入

#include "apue.h"
ssize_t readn(int fd, void *buf, size_t nbytes);
ssize_t writen(int fd, void *buf, size_t nbytes);

返回值

  • 两个函数返回:已读、写字节数,若出错则为-1

三、函数的实现

#include<unistd.h>
ssize_t readn(int fd, void *ptr, size_t n)
{
    size_t nleft;
    ssize_t nread;

    nleft = n;
    while (nleft > 0) {
        if ((nread = read(fd, ptr, nleft)) < 0) {
            if (nleft == n)
                return(-1); /* error, return -1 */
            else
                break; /* error, return amount read so far */
        } else if (nread == 0) {
            break; /* EOF */
        }
        nleft -= nread;
        ptr += nread;
    }

    return(n - nleft); /* return >= 0 */
}
#include<unistd.h>
ssize_t writen(int fd, const void *ptr, size_t n)
{
    size_t nleft;
    ssize_t nwritten;

    nleft = n;
    while (nleft > 0) {
        if ((nwritten = write(fd, ptr, nleft)) < 0) {
            if (nleft == n)
                return(-1); /* error, return -1 */
            else
                break; /* error, return amount written so far */
        } else if (nwritten == 0) {
            break;
        }
        nleft -= nwritten;
        ptr += nwritten;
    }

    return(n - nleft); /* return >= 0 */
}

猜你喜欢

转载自blog.csdn.net/qq_41453285/article/details/89354096