• Linux文件


    目录

    一、基本概念

    二、研究进程和被打开文件的关系

    (一)w方式

    (二)a方式

    三、认识系统接口,操作文件

    (一)认识文件描述符

    (二)举例

    (三)理解文件


    一、基本概念

    1、所有对文件的操作

    • a、对内容操作
    • b、对属性操作

    2、内容是数据,属性也是数据——存储文件,必须既存储内容,又存放数据

    • 此处的文件,默认就是在磁盘上的文件,加载磁盘上的文件,一定会涉及访问磁盘设备(由操作系统来做)

    3、我们要访问一个文件的时候,都是要把这个文件先打开

    • 访问的本质:进程要访问一个文件
    • 打开后本质是:将文件加载到内存

    4、一个进程可以打开多个文件吗?多个进程可以打开多个文件吗?

    • 加载到内存,被打开的文件,可能会存在多个
    • 进程:打开的文件 = 1 :n(1)

    5、根据1和4,操作系统在运行中,可能打开很多个文件,操作系统要不要管理打开的文件呢???需要,如何管理???先描述后组织

     

    6、文件按照是否被打开,分成:被打开的文件(在内存),没有被打开的文件(在磁盘中

    二、研究进程和被打开文件的关系

    (一)w方式

    • w:以写的方式打开,如果文件不存在就创建它 
    1. #include
    2. int main()
    3. {
    4. FILE *fp=fopen("log.txt","w");
    5. if(NULL == fp)
    6. {
    7. perror("fopen");
    8. return 1;
    9. }
    10. const char*msg = "hello world\n";
    11. int cnt = 10;
    12. while(cnt)
    13. {
    14. fputs(msg, fp);
    15. cnt--;
    16. }
    17. fclose(fp);
    18. return 0;
    19. }

    (二)a方式

    • a:也是写入,从文件结尾处开始写入,不会清空文件,是追加
    1. #include
    2. int main()
    3. {
    4. FILE *fp=fopen("log.txt","a");
    5. if(NULL == fp)
    6. {
    7. perror("fopen");
    8. return 1;
    9. }
    10. const char *msg = "message.txt\n";
    11. fputs(msg,fp);
    12. return 0;
    13. }

     

     

    三、认识系统接口,操作文件

    man 2 open
    1. NAME
    2. open, creat - open and possibly create a file or device
    3. SYNOPSIS
    4. #include
    5. #include
    6. #include
    7. int open(const char *pathname, int flags);
    8. int open(const char *pathname, int flags, mode_t mode);
    9. int creat(const char *pathname, mode_t mode);
    • pathname 这是一个字符串,指定要打开或创建的文件的路径名。它可以是文件的相对路径或绝对路径。

    • flags 这是一个整数参数,表示打开文件的方式和行为。它可以是以下几个常见标志的组合:

      • O_RDONLY:只读方式打开文件。
      • O_WRONLY:只写方式打开文件。
      • O_RDWR:读写方式打开文件。
      • O_CREAT:如果文件不存在,则创建文件
      • O_APPEND:在文件末尾追加内容而不覆盖原有内容。
      • O_TRUNC:如果文件存在,并且以写入方式打开,那么清空文件内容。
      • O_EXCL:与O_CREAT一同使用时,如果文件存在则返回错误。
    • mode 这是一个权限参数,仅在使用O_CREAT标志时才需要提供。它定义了新创建文件的权限。通常使用八进制表示,比如 0644 表示文件所有者具有读写权限,其他用户只有读权限。

    • 返回值:返回一个文件描述符(fd),如果出现错误则返回-1

    (一)认识文件描述符

    1. #include
    2. #define print1 1 //0001
    3. #define print2 (1<<1) //0010
    4. #define print3 (1<<2) //0100
    5. #define print4 (1<<3) //1000
    6. void print(int flags)
    7. {
    8. if(flags & print1) printf("hello 1\n"); //检查 flags 中是否包含 print1 对应的标志位
    9. if(flags & print2) printf("hello 2\n");
    10. if(flags & print3) printf("hello 3\n");
    11. if(flags & print4) printf("hello 4\n");
    12. else printf("None\n");
    13. }
    14. int main()
    15. {
    16. print(print1); //输出了 hello 1,因为 print1 代表的标志位被设置
    17. printf("------------\n");
    18. print(print1|print2);//输出了 hello 1 和 hello 2,因为 print1 和 print2 的标志位都被设置
    19. printf("------------\n");
    20. print(print1|print2 | print3);
    21. printf("------------\n");
    22. print(print3|print4);
    23. printf("------------\n");
    24. print(print4);
    25. return 0;
    26. }

     

    (二)举例

    1. #include
    2. #include //close的头文件
    3. #include //strlen的头文件
    4. //下面三个是open的头文件
    5. #include
    6. #include
    7. #include
    8. int main()
    9. {
    10. umask(0);//更改掩码
    11. int fd = open("log.txt",O_WRONLY | O_CREAT | O_TRUNC, 0666);
    12. if(fd < 0)
    13. {
    14. perror("open");
    15. return 1;
    16. }
    17. const char *msg="aaaaa";
    18. write(fd,msg,strlen(msg));
    19. close(fd);
    20. return 0;
    21. }

     

     

    (三)理解文件

     

     

  • 相关阅读:
    【PAT甲级】1027 Colors in Mars
    springboot配置注入增强(三)自定义数据源/自定义解析方法
    【项目_04】加载时动画效果、跳转详情页、轮播图自定义指示器、搭建详情页 | 基于Vue3全家桶
    【HarmonyOS】【ArkUI】在Service中使用Emitter
    redis的性能管理
    导出oracle远程数据库到本地
    算法笔记——路径问题
    【计算机视觉|人脸建模】PanoHead:360度几何感知的3D全头合成
    怎么裁剪图片?总结了下面几个方法
    Flink学习之旅:(二)构建Flink demo工程并提交到集群执行
  • 原文地址:https://blog.csdn.net/m0_63783532/article/details/134561228