问题陈述
一个进程打开一个文件进行追加(假设没有 O_APPEND,这里追加意味着先到lseek()文件末尾然后write()),然后分叉一个子进程。两个相关进程同时附加到文件中。假设lseek()和write()都是原子的。举一个例子来讨论在这个场景中拥有lseek()和write()成为一个原子操作的必要性。
我的想法
- 当前文件偏移量存储在打开文件表中的条目中,并且该条目由 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()需要成为一个原子操作?