• [Linux]文件基础-如何管理文件


    回顾C语言之 - 文件如何被写入

    fopen fwrite fread fclose fseek

    这一系列函数都是C语言中对文件进行的操作:

    int main()
    {
        FILE* fp=fopen("text","w");
        char str[20]="write into text";
        fputs(str,fp);
        fclose(fp);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    而上述C语言指令本质上都是封装了操作系统的指令实现了具体操作,例如:fopen封装了open,fclose封装了close,所以不用C语言提供的fopen…函数,也可以实现文件操作

    int main()
    {
        int fd=open("text",O_WRONLY|O_CREAT|O_TRUNC,0666);
        char str[100]="write into text";
        write(fd,str,sizeof(str));
        close(fd);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    Linux中的文件是怎么被管理的

    了解OS中对文件的基本操作后,已经能够自行管理文件,如何决定想要管理的文件是那个呢?现在开始探究文件是如何被管理的

    1、想要对文件进行操作,需要先打开文件

    电脑的内存容量是偏小的,所以文件都会被保存在磁盘上面。只有当进行操作的时候,才会加载到内存中

    2、谁来打开这些文件

    这些文件都是由进程负责打开和关闭,而对其进行管理则需要用到文件描述符fd

    3、fd(文件描述符)是什么

    文件描述符概括来说就是一个描述符对应一个文件,每当一个文件被打开,都会被赋予一个文件描述符

    下图便是Linux中对于文件管理所用的结构体

    在这里插入图片描述

    task_struct中,存在files_struct结构体,用来保存文件通用的一些最基本属性。
    在该结构体中又存在一个file结构体数组,用来保存具体文件,而前文所说的fd代表的就是这个数组fd_array[ ] 的下标(即每一个下标对应一个文件)。

    其中,在fd_array[ ]中,前3个下标位置默认由stdin stdout stderr 占用

    /*下面是Linux中这几个结构体的内容*/
    struct task_struct {
        ...
        struct files_struct *files;
        ...
    }
    struct files_struct {
    	atomic_t count;
    	struct fdtable *fdt;
    	struct fdtable fdtab;
    	spinlock_t file_lock ____cacheline_aligned_in_smp;
    	int next_fd;
    	struct embedded_fd_set close_on_exec_init;
    	struct embedded_fd_set open_fds_init;
    	struct file * fd_array[NR_OPEN_DEFAULT];
    };
    struct file {
    	struct file *next;
    	struct file *parent;
    	char *name;
    	int lineno;
    	int flags;
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
  • 相关阅读:
    Python入门进阶:68 个 Python 内置函数详解
    汇编语言王爽第四版检测点15.1答案
    文件上传漏洞之upload-labs
    DFL3:软件版本的选择和安装详解
    新手树莓派4B安装Supervised+Home Assistant
    状态设计模式完成商品的创建状态之间的流转
    Linux目录和文件管理
    软件过程与管理_期末复习知识点回顾总结
    Java基础之《Ajax+JQuery(JavaEE开发进阶Ⅱ)》—JQuery与Ajax的应用(2)
    移动机器人+机械手臂+视觉定位抓取物料
  • 原文地址:https://blog.csdn.net/m0_75062065/article/details/136274501