Linux 基础IO

发布于:2025-07-03 ⋅ 阅读:(14) ⋅ 点赞:(0)
  • 标准库IO接口

    • 操作句柄:FILE* 文件流指针
  • 系统调用接口

    • 操作句柄:文件描述符
    • 接口操作:详情点击接口操作
  • 文件描述符

    • 内核为每个打开的文件或I/O资源分配的唯一整数表示
    • 定义
      • 文件描述符是一个非负整数,用于表示进程已打开的文件、套接字、管道等资源
      • 每个进程维护一个文件描述符表,记录已打开资源
    • 标准文件描述符:每个进程默认有三个预打开的文件描述符 0 1 2
    • 工作原理
      • 三层抽象
        • 文件描述符表:每个进程独有的数组,索引为文件描述符
        • 文件表:内核全局维护,记录文件状态、偏移量等
        • vnode表:存储文件的inode信息,多个进程可共享
      • 打开同一文件
        • 进程A和B分别打开test.txt
          • 每个进程获得独立的文件描述符
          • 共享同一个文件表项
      • 复制文件描述符
        • 通过dup()或fork()创建的子进程
          • 共享一个文件表项,因此文件偏移量会相互影响
  • 重定向

    • 概念:将进程的输入或输出数据流从默认设备转移到其它设备或文件的技术
    • 详情点击查看重定向详情
  • 文件系统

    • 核心特性
      • 层次化目录结构
        • 以“/”(根目录)为顶层,形成树形目录结构,所有文件和设备都挂载在该树的某个节点上
      • 一切皆文件理念
        • 将硬件设备、目录、管道、套接字等都视为文件处理,统一通过文件api接口操作
      • 多种文件系统格式支持
        • ext4:Linux默认文件系统
        • xfs
        • nfs
      • 文件权限与用户管理
    • Linux文件系统的关键组件
      • 超级块(Superblock)
        • 存储文件系统的元数据
          • 文件系统类型、大小、块数、空闲块数
          • inode总数、空闲inode数
          • 挂载信息和日志信息
        • 每个文件系统只有一块超级块,位于磁盘特定位置
      • inode(索引节点)
        • 存储文件的元数据,不包含文件名
          • 文件大小、创建/修改/访问时间
          • 所有者和所属组、权限位
          • 数据块指针
      • 数据块(data block)
        • 实际存储文件内容的区域,大小由文件系统格式化时指定
        • 小文件可能占用部分块,大文件分散在多个块中,通过inode的指针链关联
      • 目录项
        • 存储文件名与inode号的映射关系,目录本质时包含多个项的特殊文件
        • 示例:目录/home中的每个子目录项对应一个用户文件夹的inode
    • 文件系统的工作流程
      • 文件访问流程
        • 用户通过路径请求访问文件
        • 系统从根目录开始解析路径,根据目录项找到对应inode
        • 读取inode中的元数据,验证权限并获取数据块指针
        • 根据指针读取数据块内容,返回给用户
      • 写入文件流程
        • 分配空闲inode和数据块
        • 更新目录项,建立文件名与inode的映射
        • 将数据写入数据块,并更新inode中的元数据(如大小、时间)
        • 同步超级块中的空闲块和inode计数
  • 文件系统的高级特性

    • 软链接:类似于Windows快捷方式指向目标文件的路径,inode独立,是一个独立的文件,其内容指向另一个文件或目录的路径
      • 命令:ln -s source link
      • 特点
        • 删除源文件后软链接会失效(变成断链)
        • 可以跨文件系统创建
        • 不能对目录创建软链接
        • 有自己独立的inode号和文件属性
    • 硬链接:多个文件共享同一个inode,修改任一文件会同步变更
      • 命令:ln source link,不能跨文件系统创建
      • 特点
        • 删除其中一个链接,不会影响其它链接和文件数据
        • 无法跨文件系统创建
        • 不能对目录创建硬链接
        • 所有链接共享相同的inode号和文件属性