本文共 766 字,大约阅读时间需要 2 分钟。
我们经常使用的读写函数是read()和write(),但是每次读写只能读入或者写入到一个缓冲区,今天介绍另一种读写函数,可以一次调用,读写多个非连续缓冲区。
#includessize_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 */
众所周知,(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);
转载地址:http://nwpub.baihongyu.com/