有关O_APPEND标志和lseek()的使用
编程之路刚刚开始,错误难免,希望大家能够指出。
O_APPEND表示以每次写操作都写入文件的末尾。
lseek()可以调整文件读写位置。
<<Linux/UNIX系统编程手册>>上有这样一个问题:当在O_APPEND打开后,然后用 lseek移动文件开头,然后再用write写,这个时候,数据会显示在文件中的哪个位置?为什么?
先上代码:
1 #include <unistd.h> 2 #include <string.h> 3 #include <fcntl.h> 4 #include <stdio.h> 5 6 int main(void) 7 { 8 int fd = open("test_open.txt",O_RDWR | O_APPEND); 9 if(fd < 0) 10 { 11 perror("open"); 12 } 13 14 int pos = lseek(fd,0,SEEK_SET); 15 if(pos != 0) 16 { 17 printf("lseek error\n"); 18 return -1; 19 } 20 21 int size =write(fd,"world",strlen("world")); 22 if(size != 5) 23 { 24 printf("write error\n"); 25 } 26 27 close(fd); 28 return 0; 29 }
test_open.txt的内容随意,编译运行程序会发现数据显示在了文件最后,这个原因在APUE的3.8章节提到了:
对于普通文件,写操作从文件的当前偏移量处开始。如果在打开该文件时,指定了O_APPEND选项,则在每次写操作之前,将文件偏移量设置在文件的当前结尾处。在一次成功写入之后,该文件偏移量增加实际写的字节数。
其实就是在说O_APPEND会将lseek()的作用抵消掉。