一、函数readv及writev
我们经常使用的读写函数是read()和write(),但是每次读写只能读入或者写入到一个缓冲区,今天介绍另一种读写函数,可以一次调用,读写多个非连续缓冲区。
#include <sys/uio.h>
ssize_t readv(int fd,const struct iovec*iov,int iovcnt);
ssize_t writev(int fd,const struct iovec*iov,int iovcnt);
/* 参数说明:
fd:操作的文件描述符
iov:操作的缓冲区数组首地址
iov的结构体内容 :
struct iovec{
void* iov_base;//缓冲区地址
ssize_t iov_len;//缓冲区长度
}
iovcnt:表示iov结构体的数目。
返回值:成功则返回已读或者已写的字节数,若出错,则返回-1 */
二、函数readn和writen
众所周知,(1)一次read的返回值可能少于所要求的数据长度,即使没有到达文件尾,这不是一个错误,可能是因为信号中断,或者其他原因,此时我们应该继续访问文件。(2)一次write的返回值可能少于所要求的数据长度,可能因为内核缓冲区满等原因,这也不是一个错误,我们也应该继续访问文件。
而函数readn和writen将按照你所要求的数据长度不断读写,直到达到你的要求(信号中断也可能导致返回值不是要求长度)。函数声明如下:
#include "apue.h"
ssize_t readn(int fd,void* buf,ssize_t nbytes);
ssize_t writen(int fd,void* buf,ssize_t nbytes);