看看下面的代码:
1 #include <sys/types.h>
2 #include <unistd.h>
3 #include <stdio.h>
4 #include <fcntl.h>
5
6 int main()
7 {
8 off_t currpos;
9 int fd;
10 fd=open("tlseek.txt",O_CREAT | O_WRONLY | O_APPEND,0644);
11 write(fd,"hello,world\r\n",13);
12 currpos=lseek(fd,0,SEEK_CUR);
13 printf("currpos is %d\n",currpos);
14 currpos=lseek(fd,0,SEEK_SET);
15 printf("after seek_set,the currpos is %d\n",currpos);
16 write(fd,"after seek \r\n",13);
17 close(fd);
18 }
根据lseek显式的为一个打开的文件设置其偏移量的作用,按照常理第16行的代码应该是覆盖文件的第一行,但是最终结果还是在文件的末尾,虽然上面的14行的代码的确使偏移量变为了0,但是这里要清楚O_APPEND的作用,在以O_APPEND的方式open一个文件时,说明在每次写之前,都讲标志位移动到文件的末端,而且这是个原子操作,也即每次调用write是执行“移动到文件末尾,写数据”这个原子操作。
而read没有这个问题!!