调用fsync/close前执行lseek(SEEK_END)能否获取准确文件大小?并行场景如何?
问题解答
1. lseek(SEEK_END)的返回值
当你调用pwrite()成功写入1M数据到原大小1M的文件末尾后,即使还没执行fsync()或close(),调用lseek(fd, 0, SEEK_END)会返回2M。
原因是:pwrite()完成后,内核已经更新了该文件的元数据(包括文件大小),这个逻辑大小是内核维护的内存状态,和数据是否刷写到磁盘(fsync()的作用)无关。只要写入操作成功,文件的当前大小就已经被内核更新,lseek读取的是这个内存中的实时值。
2. 并行进程调用lseek(SEEK_END)的返回值
是否相同取决于并行进程的操作:
- 如果所有并行进程都只是读取文件大小,没有其他进程对该文件执行写入、截断(
truncate())等修改文件大小的操作,那么所有进程调用lseek(SEEK_END)会得到相同的返回值; - 如果有其他并行进程同时在对该文件执行写入、截断等操作,那么不同进程调用
lseek(SEEK_END)的返回值可能不同——因为内核维护的文件大小会随着这些修改操作实时更新,每个lseek调用获取的是调用瞬间的文件大小。
内容的提问来源于stack exchange,提问作者Bobi.Liu
相关产品推荐
相关产品推荐

