• 第10章——系统级I/O


    • 输入/输出是在主存和外部设备之间复制数据的过程

    Unix I/O

    • Unix I/O:将设备被优雅地映射为文件,允许Linux内核引出一个简单、低级的引用接口,使得所有的输入和输出都能以一种统一且一致的方式来执行:
      • 打开文件:内核返回一个小的非负整数,叫做描述符,它在后续对此文件的所有操作中标识这个文件
      • 打开标注输入、标准输出、标准错误文件
      • 改变当前的文件位置:从文件开头起始的字节偏移量
      • 读写文件
      • 关闭文件

    文件

    • Linux文件类型:
      • 普通文件:文本文件(只含有ASCII或Unicode字符的普通文件)和二进制文件
      • 目录:包含一组链接的文件,其中每个链接都将一个文件名映射到一个文件,这个文件也可能是另一个目录
      • 套接字:用来与另一个进程进行跨网络通信的文件

    打开和关闭文件

    • open函数将filename转换为一个文件描述符,并且返回描述符数字
    • close函数关闭一个打开的文件

    读和写文件

    • 调用readwrite函数来执行输入和输出

    用RIO包健壮地读写

    • RIO的无缓冲的输入输出函数:直接在内存和文件之间传送数据,没有应用级缓冲
    • RIO的带缓冲的输入函数:高效地从文件中读取文本行和二进制数据,是线程安全的

    读取文件元数据

    • 通过调用statfstat函数可以检索关于文件的信息(元数据),stat的输入是文件名,fstat的输入是文件描述符

    读取目录内容

    • readdir函数来读取目录的内容,输入为目录流,返回指向目录流中下一个目录项的指针,没有则返回NULL。目录项是一个结构,包含文件名和文件位置
    • opendir函数以路径名为参数,返回指向目录流的指针,流是对条目有序列表的抽象,在这里是指目录项的列表
    • closedir函数关闭流并释放其所有的资源

    共享文件

    • 内核用三个相关的数据结构来表示打开的文件:
      • 描述符表:每个进程都有它独立的描述符表,每个打开的描述符表项指向文件表中的一个表项
      • 文件表:打开文件的集合是由一张文件表来表示的,所有进程共享这张表,每个文件表的表项组成包括当前的文件位置、引用计数,以及一个指向v-node表中对应表项的指针
      • v-node表:同文件表一样,所有的进程共享这张v-node表,每个表项包含stat结构中的大多数信息
    • 多个描述符可以通过不同的文件表表项来引用同一个文件

    I/O重定向

    • dup2函数复制描述符表表项oldfd到描述符表表项newfd,覆盖后者以前的内容

    标准I/O

    • C语言定义了一组高级输入输出函数,称为标准I/O库
  • 相关阅读:
    JavaScript基础总结---重点
    Vue.extend()实在是妙啊
    golang工程中间件——redis常用结构及应用(set,zset)
    【开源】嵌入式微服务框架MAES
    1108 Finding Average (PAT甲级)
    LeetCode 643. Maximum Average Subarray I
    金仓数据库KingbaseES整型与浮点类型数据比较隐式转换规则
    C++ 20 并发编程 std::promise
    第143篇 solidity 中的 error-revert
    关于header in Cpp
  • 原文地址:https://blog.csdn.net/qq_44867112/article/details/127887072