文档上man lseek
说,
如果
O_APPEND
在打开的文件描述上设置了文件状态标志,则 awrite(2)
始终将文件偏移量移动到文件末尾,无论是否使用lseek()
.
它没有说明是否将文件偏移量移动到调用之前或之后的末尾write(2)
。
当文件打开时是否可以O_APPEND
到lseek
顶部并重写文件?
当文件打开时是否可以
O_APPEND
到lseek
顶部并重写文件?
不。
如果设置了文件状态标志的 O_APPEND 标志,则在每次写入之前,文件偏移量应设置为文件末尾,并且在更改文件偏移量和写入操作之间不应发生中间文件修改操作。
但是,您可以使用pwrite()
:
该
pwrite()
函数应与 等效write()
,只是它写入给定位置并且不更改文件偏移量(无论是否O_APPEND
设置)。的前三个参数与添加文件内所需位置的第四个参数偏移量pwrite()
相同。write()
...
您只需要自己管理偏移量即可。
不幸的是,pwrite()
在 Linux 上被破坏了:
POSIX 要求打开带有该
O_APPEND
标志的文件不应影响写入数据的位置pwrite()
。但是,在 Linux 上,如果使用 打开文件O_APPEND
,pwrite()
则将数据追加到文件末尾,无论 的值如何offset
。
所以在 Linux 上没有办法重写用O_APPEND
.