现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

pread与pwrite使用

2020-04-12 14:28 工业·编程 ⁄ 共 1214字 ⁄ 字号 暂无评论

1 缘由

在阅读seastar源码时发现有使用pread函数,这也是第一次认识pread函数,平时用read比较多。

2 pread函数

2.1 函数原型:

#include <unistd.h>

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);

pread简单来说就是在指定偏移offset位置开始读取count个字节,同理可推``pwrite`。

2.2 使用示例

#include <unistd.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <stdio.h>

#include <iostream>

using namespace std;

int main()

{

    int fd = open("test.txt", O_RDONLY);

    if(fd < 0)

    {

        perror("open failed");

        return 1;

    }

    char buf[1024] = {0};

    int offset = 5;

    ssize_t ret = 0;

    int count = 10;

    if((ret = pread(fd, buf, count, offset)) == -1)

    {

        perror("pread failed");

        return 1;

    }

    std::cout << "read buf = " << buf << std::endl;

    return 0;

}

2.3 与read和write区别

man手册是这样说的:

The pread() and pwrite() system calls are especially useful in multi‐threaded applications. They allow multiple threads to perform I/O on the same file descriptor without being affected by changes to the file offset by other threads.

就是对于对多线程读写比较有意义,不会相互影响读写文件时的offset,这也是多线程时读写文件一个头痛的问题。不过我仔细一想。

对于pwrite来说,多个线程之间即使不影响offset但还是存在使用上的问题。

对于pread来说是可以解决多个线程offset相互影响的问题。

pread函数相当于先后调用了lseek和read函数,但是还是有区别的,有以下两点区别:

1. pread函数是原子操作,而先后调用两个函数不是原子操作;

2. pread函数是不会改变当前文件偏移量的,而read和write函数会改变当前文件偏移量。

第二点是关键,第一点暂时没有核实是否正确。

给我留言

留言无头像?