默认写行为-O_TRUNC或O_APPEND?

问题描述 投票:5回答:2

[使用访问模式openO_WRONLY的文件O_RDWR时的默认行为是什么?是在追加模式还是截断模式下打开文件?从man pages

参数标志必须包括以下访问模式之一:O_RDONLY,O_WRONLY或O_RDWR。...另外,zero个或多个file creation标志和file status标志可以按位或在标志中进行。

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

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

    write( fd, "hello", 5 );

    close( fd );
}
c linux unix system-calls file-descriptor
2个回答
8
投票

都不是

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

  • [O_TRUNC导致文件被截断(如果存在)。

  • O_APPEND使写操作追加到文件末尾,而不是在开始处覆盖。该标志是持久的。如果将光标移到其他位置以读取数据,则每次写入之前,它始终会重新定位到文件末尾。

这些标志是正交的,并且不是互斥的。如果您想最初截断文件并确保以后所有写入都始终是追加,则甚至可以合并它们。


1
投票

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

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

此行为与O_TRUNC相对,在打开时会截断文件的内容,而与O_APPEND会强制所有写入都在文件末尾进行。

© www.soinside.com 2019 - 2024. All rights reserved.