美文网首页
pread与pwrite使用

pread与pwrite使用

作者: dnsir | 来源:发表于2018-07-28 23:09 被阅读490次

1 缘由

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

2 pread函数

函数原型:

#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.1 使用示例

#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,这也是多线程时读写文件一个头痛的问题。不过我仔细一想。

  1. 对于pwrite来说,多个线程之间即使不影响offset但还是存在使用上的问题。
  2. 对于pread来说是可以解决多个线程offset相互影响的问题。

参考链接 文件IO详解(十三)---pread函数和pwrite函数详解里提到pread函数相当于先后调用了lseek和read函数,但是还是有区别的,有以下两点区别:1. pread函数是原子操作,而先后调用两个函数不是原子操作;2. pread函数是不会改变当前文件偏移量的,而read和write函数会改变当前文件偏移量。第二点是关键,第一点暂时没有核实是否正确。

2.4 链接

  1. Linux Manual-PREAD

相关文章

  • pread与pwrite使用

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

  • linux read write

    read、write、pread、pwrite都属于系统调用,p+函数多了一个offset参数,可以指定位置写入。...

  • 系统 第二天 :读写

    追加写入 计算字节数 lseek 的一些基本知识 读取指定位置结构体 pread和pwrite

  • APUE读书笔记-12线程控制(8)

    10、线程和输入输出 在前面我们介绍了pread函数和pwrite函数,这些函数在多线程的环境中是非常有用的,因为...

  • pread()函数

    pread是一个函数,用于带偏移量地原子的从文件中读取数据。 带偏移量地原子的从文件中读取数据 函数原型 ssiz...

  • pread()函数

    C语言lseek()函数:移动文件的读写位置 头文件: #include #include 定义函数: off_t...

  • Linux IO总结

    1. 文件IO,不带缓冲的IO 函数:read, write, open, close, pread, pwrit...

  • nginx: [crit] pwrite() "/usr/loc

    重启服务器出现: 问题分析:这是在告诉你服务器磁盘满了,需要清理或者开放空间磁盘大小! 解决方案: 完美解决!!!

  • Hive使用与Sqoop安装与使用

    Hive框架基础(三)理性认知: Hive创建表的方式 1.使用create命令创建一个新表 2.把一张表的某些字...

  • 【HDFS】pread的实现(从文件的指定位置开始读)

    一、前置以及扩展知识 1.1 HDFS Hedged Read Hedged Read是在Hadoop 2.4.0...

网友评论

      本文标题:pread与pwrite使用

      本文链接:https://www.haomeiwen.com/subject/hfmimftx.html