UNIX环境变量--读写函数变体

一、函数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);

猜你喜欢

转载自blog.csdn.net/Chiang2018/article/details/105468159