在Unix系统中,read()
和pread()
函数有什么区别?
在选择它们之间时,应该考虑哪些要点?
我搜索了它们之间的区别,但没有得到结果。
Pread()与read()非常相似,但它是从文件的指定位置读取数据而不会修改文件指针。
当需要反复以固定偏移量读取数据时,例如数据库索引指向文件中的个别记录,可以使用该函数来减少seek()调用的次数。
如果您的数据是顺序的,请使用read(),如果您知道或者能够计算出要读取的偏移量,请使用pread()。
pread的原子性使得共享文件描述符的进程或线程能够在特定偏移量处从共享文件中读取,而无需使用锁定机制来实现在单独的lseek和read系统调用中获得相同结果。原子性是必需的,因为文件指针是共享的,一个线程可能会在另一个进程完成lseek但在读取之前使用lseek移动指针。
谷歌给我提供了man pread
。
如果您连续调用read()
两次,您会得到两个不同的结果,这表明read()
在文件中前进。
如果您连续调用pread()
两次,您会得到相同的结果,这表明pread()
保持在文件中相同的位置。
read() 函数从当前文件偏移量开始读取请求的字节数,而 pread() 函数可以指定偏移量。这在一个函数集正在使用文件指针顺序读取文件,而另一个函数集同时访问特定数据的情况下非常有用。
pread()
要么不改变文件位置,要么不关心文件位置。(实际上,两者都是正确的。) - Adam H. Peterson