文档上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.