如果父进程和子进程追加到同一个文件,lseek() 和 write() 需要是原子的吗?

if parent and child processes append to same file, do lseek() and write() need to be atomic?

问题陈述

一个进程打开一个文件追加(假设没有O_APPEND,这里的追加是指先lseek()到文件末尾再write()),然后fork一个child。这两个相关进程同时附加到文件。假设 lseek()write() 都是原子的。举个例子讨论在这种情况下lseek()write()作为原子操作的必要性

我的想法

  1. 当前文件偏移量存储在打开文件 table 的条目中,并且该条目由 2 个相关进程共享。
  2. write() 更新刚写入数据末尾的偏移量。

这两点保证即使在下面的场景中,P2写入的数据也不会被P1覆盖。

P1 lseek()
P2 lseek()
P2 write()  // after this operation, the offset still points to the file end
P1 write()

我的问题

那么,在这种特定情况下,lseek()write() 是否仍需要是一个原子操作?

原来是措辞让我质疑自己。

答案是在这种特定情况下它们不必是原子操作。