默认写入行为 - O_TRUNC 或 O_APPEND?
Default write behaviour - O_TRUNC or O_APPEND?
当您 open
访问模式为 O_WRONLY
或 O_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_APPEND
和 O_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
形成对比,前者强制所有写入发生在文件末尾。
当您 open
访问模式为 O_WRONLY
或 O_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_APPEND
和 O_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
形成对比,前者强制所有写入发生在文件末尾。