lseek()会触发实际的机械磁盘寻找运动吗?

时间:2014-02-26 03:05:08

标签: c unix

请考虑以下代码:

lseek(fd, 100, 0); /* Seek to the 100th byte in the file fd. */
write(fd, buf, n); /* Write from that position. */
lseek(fd, 0, 0); /* Is this necessary? Will it trigger a actual disk movement? */

我想lseek回到文件的开头,以防另一行代码继续从该位置写入,认为它从文件的开头开始。首先,这是一个好习惯吗?第二...

我想知道lseek是否确实触发了实际的磁盘移动。或者,仅在实际读取或写入时才触发磁盘移动。

寻求磁盘是一个巨大的性能影响,我想知道这种防御性编码实践与性能之间的权衡。

1 个答案:

答案 0 :(得分:1)

假设这是一个Windows或Unix类型的系统,一个常规文件,你没有对文件打开标志没什么兴趣,这些功能都不会触发磁盘搜索。

很可能在5秒左右的时间内,包含该新文件数据的缓冲区将被写入磁盘以及发生的所有其他内容。

此外,lseek设置的文件位置是文件的完全虚构属性。它默认控制数据在文件中读取或写入的位置,但有许多功能只是覆盖文件位置。

至于这是不是很好的做法,我认为这不重要。但是,由于多线程,我已经不习惯在写入文件时使用搜索功能。您可能希望优先使用pread和pwrite。