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

时间:2018-11-05 16:11:54

标签: unix fork atomic lseek

问题陈述

一个进程打开一个文件进行附加(假设没有O_APPEND,此处附加意味着首先将lseek()附加到文件末尾,然后write()),然后派生一个子文件。这两个从属进程同时追加到文件。假设lseek()write()都是原子的。给出一个示例来讨论在这种情况下使lseek()write()是原子操作的必要性。

我的想法

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

这2点保证即使在以下情况下,由P2写入的数据也不会被P1覆盖。

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

我的问题

因此,在这种特定情况下,lseek()write()仍然需要成为一个原子操作吗?

1 个答案:

答案 0 :(得分:0)

原来是让我问自己一个问题的措辞。

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