繁体   English   中英

默认写入行为 - O_TRUNC 或 O_APPEND?

[英]Default write behaviour - O_TRUNC or O_APPEND?

当您以O_WRONLYO_RDWR访问模式open文件时,默认行为是什么。 文件是以追加模式还是截断模式打开的? 手册页

参数标志必须包括以下访问模式之一:O_RDONLY、O_WRONLY 或 O_RDWR。
...
此外,零个或多个文件创建标志和文件状态标志可以按位或在标志中进行。

这听起来像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使用O_WRONLY标志时,它会打开文件进行写入,保留现有文件内容,并将文件指针放在文件的开头。 任何写入都会覆盖现有内容。

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

这种行为与O_TRUNC打开时截断文件内容的O_TRUNC以及强制所有写入发生在文件末尾的O_APPEND形成对比。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM