Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2675532
  • 博文数量: 877
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 5921
  • 用 户 组: 普通用户
  • 注册时间: 2013-12-05 12:25
个人简介

技术的乐趣在于分享,欢迎多多交流,多多沟通。

文章分类

全部博文(877)

文章存档

2021年(2)

2016年(20)

2015年(471)

2014年(358)

2013年(26)

分类: C/C++

2014-05-27 10:33:49

原文地址:C小程序 - O_APPEND 作者:niannian

O_APPEND被设置时候,write操作会先seek到文件末尾,然后写入,读的时候则当前seek在哪就在哪读,
比如文件1.txt
#cat 1.txt
abcd

  1. #o_append.c
  2. #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的出现实际上是为了解决以前多个进程对同一文件写操作时候,lseek和write是分开进行的,这样在移动文件指针和写之间进程有可能被切换,从而导致文件内容被意外覆盖等等错误。O_APPEND告诉write操作,写之前要移动文件指针到文件末尾,这成为了一个原子操作,从而不会被打断。

阅读(456) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~