• 有关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
    ");
    18         return -1;
    19     }
    20 
    21     int size =write(fd,"world",strlen("world"));
    22     if(size != 5)
    23     {
    24         printf("write error
    ");
    25     }
    26 
    27     close(fd);
    28     return 0;
    29 }

    test_open.txt的内容随意,编译运行程序会发现数据显示在了文件最后,这个原因在APUE的3.8章节提到了:
      对于普通文件,写操作从文件的当前偏移量处开始。如果在打开该文件时,指定了O_APPEND选项,则在每次写操作之前,将文件偏移量设置在文件的当前结尾处。在一次成功写入之后,该文件偏移量增加实际写的字节数。

      其实就是在说O_APPEND会将lseek()的作用抵消掉。

  • 相关阅读:
    题解 CF700E Cool Slogans
    题解 LOJ2065 「SDOI2016」模式字符串
    以guest账号无密码访问设置
    共享
    计算机的C$共享在哪里
    网卡工作原理
    iperf网络测试
    Jmeter安装与使用(压测)
    压测工具使用(vegeta)
    Alertmanager 安装(k8s报警)
  • 原文地址:https://www.cnblogs.com/jiangyibo/p/8697159.html
Copyright © 2020-2023  润新知