pwrite和pread相对于fwrite和fread有什么优势?
pwrite
pread
fwrite
fread
yv5phkfx1#
有两个部分:
read
write
fae0ux8s2#
当你进行大量的随机读/写操作时,它很有用。SQLite3甚至有一个选项,可以用pread()/pwrite()替换seek() + read()和seek() + write()。优点:seek() + read()和seek() + write()都是系统调用对,而pread()和pwrite()是单个系统调用。通常一个普遍的真理是,系统调用程序问题越少,它的效率就越高。
pread()/pwrite()
seek()
read()
write()
pread()
pwrite()
4urapxun3#
调用pread/pwrite后,当前文件位置不会更改。另外,由于不需要调用lseek来更改当前文件位置,pread/pwrite避免了涉及多个线程时的潜在竞争条件。
lseek
2cmtqfgy4#
只是少了一点信息。spread和pwrite是用于lseek+read()和lseek+write()的原子操作。主要用途是保证lseek+read()和lseek+write()之间没有内核中断,这在两个进程打开同一个文件时很有用
4条答案
按热度按时间yv5phkfx1#
有两个部分:
pread
/pwrite
和read
/write
的区别:它们都在同一级别,即系统调用。有两个不同点:
1.“p”变量读取偏移量,因此它们独立于当前文件指针。这使得并发地从多个线程读/写更容易。
1.“p”变体仅对可查找文件(即真实的的文件,而不是管道、套接字或设备)。
read
/pread
/write
/pwrite
与fread
/fwrite
的区别:“f”变体是前者的标准运行时 Package 器(使用基本变体)。它们支持进程内缓冲。这可以显著提高简单代码的性能,但它使使用系统调用级别的其他功能变得不切实际。
只有当你很好地使用随机偏移量阅读时才使用“p”变体(避免查找并允许通过一个文件句柄进行并发访问),这通常是某些类型的数据库文件(面向记录,具有已知偏移量的记录)的情况,而在其他应用程序中很少。
fae0ux8s2#
当你进行大量的随机读/写操作时,它很有用。SQLite3甚至有一个选项,可以用
pread()/pwrite()
替换seek()
+read()
和seek()
+write()
。优点:
seek()
+read()
和seek()
+write()
都是系统调用对,而pread()
和pwrite()
是单个系统调用。通常一个普遍的真理是,系统调用程序问题越少,它的效率就越高。4urapxun3#
调用
pread
/pwrite
后,当前文件位置不会更改。另外,由于不需要调用
lseek
来更改当前文件位置,pread
/pwrite
避免了涉及多个线程时的潜在竞争条件。2cmtqfgy4#
只是少了一点信息。spread和pwrite是用于lseek+read()和lseek+write()的原子操作。主要用途是保证lseek+read()和lseek+write()之间没有内核中断,这在两个进程打开同一个文件时很有用