linux O_APPEND
(2013-06-18 15:38:08)分类: 资料的查询 |
O_APPEND被设置时候,write操作会先seek到文件末尾,然后写入,读的时候则当前seek在哪就在哪读,
比如文件1.txt
#cat 1.txt
abcd
O_APPEND的出现实际上是为了解决以前多个进程对同一文件写操作时候,lseek和write是分开进行的,这样在移动文件指针和写之间进程有可能被切换,从而导致文件内容被意外覆盖等等错误。O_APPEND告诉write操作,写之前要移动文件指针到文件末尾,这成为了一个原子操作,从而不会被打断。
如果两个进程同时打开一个文件会有什么结果?如果之前指定了O_APPEND呢?
比如文件1.txt
#cat 1.txt
abcd
- #o_append.c
-
#include
#include
int main(int ac, char * av[])
{
int fd;
char buf[] = "1234567";
off_t currpos;
int s;
if((fd=open(av[1], O_RDWR))==-1)
perror("open error");
s = fcntl(fd, F_GETFL);
s |= O_APPEND;
if(fcntl(fd, F_SETFL, s) == -1)
perror("set flag error");
if(lseek(fd, 0, SEEK_SET) == -1) //虽然这里把文件定位到开始处
perror("lseek error");
if(write(fd, buf, strlen(buf)) != strlen(buf)) //但是写后发现仍然被写到文件末尾
perror("write error");
currpos = lseek(fd, 0, SEEK_CUR); //获得当前seek的位置,可以看到已经是文件末尾
printf("currpos = %d\n", currpos);
if(lseek(fd, 0, SEEK_SET) == -1) //再次seek到开始处
perror("lseek error");
if(read(fd, buf, strlen(buf)) != strlen(buf)) //从开始处读入数据
perror("read error");
printf("read buf = %s\n", buf);
close(fd);
exit(0);
}
光打开是没有什么后果的,两个进程都可以正常的读,但如果指定了O_APPEND的话就是这样了:A进程如果先在文件尾部加了一段内容A,那么此时文变为了“原内容”+A,但是对于B进程来说,它本想只在“原内容”后面加一段B,但由于不知道A也打开了文件,所以很单纯的Append了一段B在文件后,所以导致的结果是,A的真实内容为“原内容”+A+B而不是B预想的“原内容”+B,这样的话就有问题了。
博客出自:http://blog.chinaunix.net/uid-1911213-id-3383951.html
后一篇:fcntl()