文档上man lseek
说,
如果
O_APPEND
在打开的文件描述上设置了文件状态标志,则 awrite(2)
始终将文件偏移量移动到文件末尾,无论是否使用lseek()
.
它没有说明是否将文件偏移量移动到调用之前或之后的末尾write(2)
。
当文件打开时是否可以O_APPEND
到lseek
顶部并重写文件?
答案1
当文件打开时是否可以
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
.
答案2
不,您不能重写该文件。在write
执行每个文件之前,将文件偏移量设置为末尾。