问题陈述
一个进程打开一个文件进行追加(假设没有 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()
需要成为一个原子操作?