[使用访问模式open
或O_WRONLY
的文件O_RDWR
时的默认行为是什么?是在追加模式还是截断模式下打开文件?从man pages:
参数标志必须包括以下访问模式之一:O_RDONLY,O_WRONLY或O_RDWR。...另外,zero个或多个file creation标志和file status标志可以按位或在标志中进行。
听起来像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
会强制所有写入都在文件末尾进行。