O_APPEND 很少与O_TRUNC 一起使用。我认为 C fopen 模式的任何组合都不会产生这种组合(在 POSIX 系统上,这是相关的)。
O_APPEND 确保每次写入都在文件末尾自动完成,无论写入位置如何。特别是,这意味着如果多个进程正在写入文件,它们不会踩踏彼此的写入。
请注意,POSIX 不需要O_APPEND 的原子行为。它要求在写入之前自动搜索到文件的(当前)末尾,但它并不要求在写入时该位置仍然是文件的末尾。即使在具有原子O_APPEND 的实现上,它也可能不适用于所有文件系统。 open 上的 Linux 手册页警告说,O_APPEND 在 NFS 上不能以原子方式工作。
现在,如果每个进程在打开文件时都使用O_TRUNC,它将破坏所有其他进程写入的所有内容。这与进程不应该破坏彼此的写入的想法相冲突,为此指定了O_APPEND。
O_APPEND 不需要通过单个进程附加到文件,该进程被理解为唯一的写入者。可以只搜索到最后,然后开始写入新数据。有时O_APPEND 无论如何都用于独占情况,只是因为它是一种编程快捷方式。我们不必费心额外调用 position 到文件末尾。比较:
FILE *f = fopen("file.txt", "a");
// check f and start writing
对比:
FILE *f = fopen("file.txt", "r+");
// check f
fseek(f, 0, SEEK_END); // go to the end, also check this for errors
// start writing
我们可以考虑这样的想法,我们有一组进程使用O_APPEND 到一个文件,这样第一个也执行O_TRUNC 以首先截断它。但是这样编程似乎很尴尬;进程要判断它是否是第一个打开文件的进程并不容易。
如果在启动时需要这种情况,其中启动前的旧文件由于某种原因无关紧要,只需在启动时执行一个操作(脚本或其他)在这些多个之前删除旧文件进程启动。然后每个人都使用O_CREAT 在必要时创建文件(如果它是第一个进程)但没有O_TRUNC(如果它们不是第一个进程),并使用O_APPEND 来执行原子(如果可用) ) 附加的东西。