O_APPEND 与 lseek 的行为是什么:您可以重写在 O_APPEND 中打开的文件吗?

O_APPEND 与 lseek 的行为是什么:您可以重写在 O_APPEND 中打开的文件吗?

文档上man lseek说,

如果O_APPEND在打开的文件描述上设置了文件状态标志,则 awrite(2)始终将文件偏移量移动到文件末尾,无论是否使用lseek().

它没有说明是否将文件偏移量移动到调用之前或之后的末尾write(2)

当文件打开时是否可以O_APPENDlseek顶部并重写文件?

答案1

当文件打开时是否可以O_APPENDlseek顶部并重写文件?

不。

根据POSIX 文档write()

如果设置了文件状态标志的 O_APPEND 标志,则在每次写入之前,文件偏移量应设置为文件末尾,并且在更改文件偏移量和写入操作之间不应发生中间文件修改操作。

但是使用pwrite()

pwrite()函数应与 等效write(),只是它写入给定位置并且不更改文件偏移量(无论是否O_APPEND设置)。的前三个参数与添加文件内所需位置的第四个参数偏移量pwrite()相同。 write()...

您只需要自己管理偏移量即可。

很遗憾,pwrite()在 Linux 上坏了

POSIX 要求打开带有该O_APPEND标志的文件不应影响pwrite()写入数据的位置。但是,在 Linux 上,如果使用 打开文件O_APPENDpwrite() 则将数据追加到文件末尾,无论 的值如何 offset

所以在 Linux 上没有办法重写用O_APPEND.

答案2

不,您不能重写该文件。在write执行每个文件之前,将文件偏移量设置为末尾。

相关内容