-
这两个函数是自己实现的,不是系统自带的
一、引入
管道,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 */
}