pwrite和pread相比fwrite和fread有什么优势?

时间:2011-09-29 05:25:44

标签: c++ posix

嘿,请不要介意我是否在问一些微不足道的问题,但是,请有人帮我这个......

3 个答案:

答案 0 :(得分:31)

分为两部分:

  1. pread / pwriteread / write之间的差异:

    它们都处于同一级别,即系统调用。有两点不同:

    1. “p”变体采用偏移量来读取,因此它们独立于当前文件指针。这使得同时从多个线程读取/写入更容易。
    2. “p”变体仅适用于可搜索文件(即真实文件,而不是管道,套接字或设备)。
  2. read / pread / write / pwritefread / fwrite之间的差异:

    “f”变体是前者的标准运行时包装器(使用基本变体)。它们支持进程内缓冲。这可以显着提高简单代码的性能,但它会利用系统调用级别的其他功能,这是不切实际的。

  3. 如果您可以很好地使用随机偏移量读取(避免搜索并允许通过一个文件句柄进行并发访问),则只使用“p”变体,这通常是某种数据库文件的情况(以记录为导向)已知偏移量,很少在其他应用中使用。

答案 1 :(得分:15)

当您进行大量随机读/写操作时,它非常有用。 SQLite3甚至还有一个选项,用seek()替换read() + seek()write() + pread()/pwrite()

优势:seek() + read()seek() + write()两者都是系统调用对,而pread()pwrite()是单一的系统调用。这通常是一个普遍的事实,即较少的系统调用程序问题就越有效。

答案 2 :(得分:5)

调用 String pattern; Pattern p = Pattern.compile("\"([^\"]*)\""); Matcher m; Pattern number = Pattern.compile("\\d+"); Matcher num; m = p.matcher(s); num = number.matcher(s); if(m.find()){ System.out.println(m.group(1)); } if(num.find()){ System.out.println(num.group(0)); } / pread后,当前文件位置无法更改。

另外,因为您不需要致电pwrite来更改当前文件位置lseek / pread,以避免涉及多个线程时的潜在竞争条件。