You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 16:32:07