c++ pwrite和pread相对于fwrite和fread有什么优势?

yquaqz18  于 2023-07-01  发布在  其他
关注(0)|答案(4)|浏览(323)

pwritepread相对于fwritefread有什么优势?

yv5phkfx

yv5phkfx1#

有两个部分:

  1. pread/pwriteread/write的区别:
    它们都在同一级别,即系统调用。有两个不同点:
    1.“p”变量读取偏移量,因此它们独立于当前文件指针。这使得并发地从多个线程读/写更容易。
    1.“p”变体仅对可查找文件(即真实的的文件,而不是管道、套接字或设备)。
  2. read/pread/write/pwritefread/fwrite的区别:
    “f”变体是前者的标准运行时 Package 器(使用基本变体)。它们支持进程内缓冲。这可以显著提高简单代码的性能,但它使使用系统调用级别的其他功能变得不切实际。
    只有当你很好地使用随机偏移量阅读时才使用“p”变体(避免查找并允许通过一个文件句柄进行并发访问),这通常是某些类型的数据库文件(面向记录,具有已知偏移量的记录)的情况,而在其他应用程序中很少。
fae0ux8s

fae0ux8s2#

当你进行大量的随机读/写操作时,它很有用。SQLite3甚至有一个选项,可以用pread()/pwrite()替换seek() + read()seek() + write()
优点:seek() + read()seek() + write()都是系统调用对,而pread()pwrite()是单个系统调用。通常一个普遍的真理是,系统调用程序问题越少,它的效率就越高。

4urapxun

4urapxun3#

调用pread/pwrite后,当前文件位置不会更改。
另外,由于不需要调用lseek来更改当前文件位置,pread/pwrite避免了涉及多个线程时的潜在竞争条件。

2cmtqfgy

2cmtqfgy4#

只是少了一点信息。spread和pwrite是用于lseek+read()和lseek+write()的原子操作。主要用途是保证lseek+read()和lseek+write()之间没有内核中断,这在两个进程打开同一个文件时很有用

相关问题