C语言读写文件函数:read/write,pread/pwrite,readv/writev,preadv/pwritev,preadv2/pwritev2

函数原型

// 最基本的read,write函数
// read, write - read from or write to a file descriptor
#include 
ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd, const void *buf, size_t count);

// 在read,write函数基础上,可指定位置偏移量
// pread, pwrite - read from or write to a file descriptor at a given offset
#include 
ssize_t pread(int fd, void *buf, size_t count, off_t offset);
ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset);

// readv,writev系列函数,可一次性读写多个不连续的buffer,把buffer数组中的内容写入到文件或者从一个文件读取内容到buffer数组
// 注意第二个参数是struct iovec指针,可以传入指针或数组。每个struct iovec都是一段固定长度的buffer。
// 这些函数定义在头文件
// readv, writev, preadv, pwritev, preadv2, pwritev2 - read or write data into multiple buffers
#include 
ssize_t readv(int fd, const struct iovec *iov, int iovcnt);
ssize_t writev(int fd, const struct iovec *iov, int iovcnt);
// 在readv/writev基础上,增加了指定位置偏移量的参数
ssize_t preadv(int fd, const struct iovec *iov, int iovcnt, off_t offset);
ssize_t pwritev(int fd, const struct iovec *iov, int iovcnt, off_t offset);
// 在preadv/pwritev基础上,增加了flag,如RWF_DSYNC, RWF_SYNC, RWF_HIPRI, RWF_NOWAIT, RWF_APPEND等,
// 控制读写时同步、优先级等行为
ssize_t preadv2(int fd, const struct iovec *iov, int iovcnt, off_t offset, int flags);
ssize_t pwritev2(int fd, const struct iovec *iov, int iovcnt, off_t offset, int flags);

// struct iovec定义,起始地址和长度
struct iovec {
    void  *iov_base;    /* Starting address */
    size_t iov_len;     /* Number of bytes to transfer */
};

示例程序

read/write/pread/pwrite函数比较直观,这里仅示例readv/writev函数用法。
把程序中定义的buf通过writev函数输出到屏幕上。

#include 
#include 
#include 

int main() {

    char* buf1 = "hello ";
    char* buf2 = "world\n";

    struct iovec vec[2];				// iovec数组,输出buf

    vec[0].iov_base = buf1;				// 赋值方式1
    vec[0].iov_len = strlen(buf1);
//    vec[1].iov_base = buf2;
//    vec[1].iov_len = strlen(buf2);
    vec[1] = {							// 赋值方式2
            .iov_base = buf2,
            .iov_len = strlen(buf2)
    };

    writev(STDOUT_FILENO, vec, 2);		// writev输出到指定文件,这里是标准输出


    char* buf3 = "Hi ";
    char* buf4 = "barbie!\n";
    struct iovec *pv;					// 使用iovec指针
    pv = new iovec[] {					// 为iovec指针赋值
            {.iov_base = buf3, .iov_len = strlen(buf3)},
            {.iov_base = buf4, .iov_len = strlen(buf4)},
    };
    writev(STDOUT_FILENO, pv, 2);		// 把iovec指针指向的buf内容输出到stdout

    return 0;
}

你可能感兴趣的:(c语言,linux,android)