默认写入行为 - O_TRUNC 或 O_APPEND?

Default write behaviour - O_TRUNC or O_APPEND?

当您 open 访问模式为 O_WRONLYO_RDWR 的文件时,默认行为是什么?文件是以附加模式还是截断模式打开的?来自 man pages:

The argument flags must include one of the following access modes: O_RDONLY, O_WRONLY, or O_RDWR.
...
In addition, zero or more file creation flags and file status flags can be bitwise-or'd in flags.

这听起来像是 O_APPENDO_TRUNC 标志是可选的。那么以下是做什么的?

void main ( void )
{
    int fd = open( "foo.txt", O_WRONLY );

    write( fd, "hello", 5 );

    close( fd );
}

都没有。

  • 默认情况下,文件打开时光标位于开头。写入会覆盖文件开头的字节。

  • O_TRUNC 导致文件如果存在则被截断。

  • O_APPEND 导致写入追加到文件末尾而不是在开头覆盖。这个标志是持久的。如果您将光标移动到别处以读取数据,它总是在每次写入之前重新定位到文件末尾。

标志是正交的,并不互斥。如果您想要最初截断文件并确保所有以后的写入始终附加,您甚至可以将它们组合起来。

当单独使用O_WRONLY标志时,它打开文件进行写入,保留现有的文件内容,并将文件指针放在文件的开头。任何写入都会覆盖现有内容。

如果您使用 lseek 重新定位文件指针,后续写入将发生在重新定位的偏移量处。

此行为与 O_TRUNC 形成对比,前者在打开文件时截断文件内容,后者与 O_APPEND 形成对比,前者强制所有写入发生在文件末尾。