O_APPEND标志和lseek

kar*_*rim 13 c unix linux kernel system-calls

编写一个程序,打开现有文件,使用O_APPEND标志进行写入,然后在写入一些数据之前搜索文件的开头.数据在文件中出现在哪里?为什么?

这是我的代码:

main() {
    int fd = open("test.txt", O_WRONLY | O_APPEND);

    lseek(fd, 0, SEEK_SET);
    write(fd, "abc", 3);
    close(fd);
}
Run Code Online (Sandbox Code Playgroud)

并试过它,发现数据已写入文件的末尾,我想了解为什么?因为我表示O_APPEND标志没有那么简单我认为

Ada*_*eld 18

当您打开文件O_APPEND时,无论当前文件指针来自最近的调用lseek(2)或最新的读/写操作,所有数据都会写入结尾.从open(2)文档:

O_APPEND
该文件以追加模式打开.在每个write(2)文件之前,文件偏移量位于文件的末尾,就像使用lseek(2).

如果要将数据写入文件的末尾,然后将其打开,则打开它,不O_APPEND使用fstat(2),获取文件大小(st_size成员在内struct stat),然后寻找该偏移量来编写结束.

  • 对'lseek`的调用不会被忽略.这个职位很荣幸能够阅读,即使你没有阅读,它也会得到维护并且可以回读.但是,在每次写入时,位置都会移回文件的末尾. (6认同)
  • 您也可以使用`lseek(fd,0,SEEK_END)`来寻找文件的结尾(即不是获取文件大小). (3认同)
  • *当您使用"O_APPEND"打开文件时,所有数据都将写入结尾*并非所有数据.Per POSIX,[`pwrite`函数(`ssize_t pwrite(int fildes,const void*buf,size_t nbyte,off_t offset);`)](http://pubs.opengroup.org/onlinepubs/9699919799/functions/pwrite .html)可以写入任何偏移量:"`pwrite()`函数应该等同于`write()`,**,除了它写入给定位置并且不改变文件偏移量(无论是否为'O_APPEND `已设定)**." 但是Linux上的`pwrite()`被破坏了,无论在`offset`中传递什么值,都将数据附加到文件的末尾. (3认同)