[英]Default write behaviour - O_TRUNC or O_APPEND?
当您以O_WRONLY
或O_RDWR
访问模式open
文件时,默认行为是什么。 文件是以追加模式还是截断模式打开的? 从手册页:
参数标志必须包括以下访问模式之一:O_RDONLY、O_WRONLY 或 O_RDWR。
...
此外,零个或多个文件创建标志和文件状态标志可以按位或在标志中进行。
这听起来像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
使用O_WRONLY
标志时,它会打开文件进行写入,保留现有文件内容,并将文件指针放在文件的开头。 任何写入都会覆盖现有内容。
如果您使用lseek
重新定位文件指针,后续写入将发生在重新定位的偏移量处。
这种行为与O_TRUNC
打开时截断文件内容的O_TRUNC
以及强制所有写入发生在文件末尾的O_APPEND
形成对比。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.