CSSAPP稀里糊涂的读书笔记(十)系统级I/O

本章介绍Unix I/O 和标准I/O的一般概念,具体的细节什么的还是看书比较好。

  1. 一个Linux 文件就是一个 m 个字节的序列,所有的I/O设备都被模型化为文件,而所有的输入和输出都被当作对响应文件的读和写来执行。这种将设备优雅地映射为文件地方式,允许Linux内核引出一个简单、低级地应用接口,称为Unix I/O,这使得所有地输入和输出都能以一种统一且一致地方式来执行:
  • 打开文件。一个应用程序通过要求内核打开相应的文件,来宣告它想要访问一个I/O 设备。内核返回一个小的非负整数,叫做描述符,它在后续对此文件的所有操作中标识这个文件。内核记录有关这个打开文件的所有信息。应用程序只需记住这个描述符。
  • Linux shell 创建的每个进程开始时都有三个打开的文件:标准输入(描述符为0)、标准输出(描述符为1)和标准错误(描述符为2).
  • 改变当前的文件位置。对于每个打开的文件,内核保持着一个文件位置k,初始为0。这个文件位置就是从文件开头起始的字节偏移量。应用程序能够通过执行seek 操作,显示地设置文件地当前位置为k。
  • 读写文件。一个读操作就是从文件复制 n>0 个字节到内存,从当前文件位置 k 开始,然后将k 增加到 k+n。给定一个大小为m 字节的文件,当 k ≥ m 时执行读操作会触发一个称为end-of-file(EOF)的条件,应用程序能检测这个条件。在文件结尾处并没有明确的“EOF符号”。
    类似的,写操作就是从内存复制 n>0 个字节到一个文件,从当前文件位置 k 开始,然后更新k 。
  • 关闭文件。当应用完成了对文件的访问之后,它就通知内核关闭这个文件。作为响应,内核释放文件打开时创建的数据结构,并将这个描述符恢复到可用的描述符池中。无论一个进程因为何种原因终止时,内核都会关闭所有打开的文件并释放它们的内存资源。
  1. 每个Linux文件都有一个类型来表明它在系统中的角色:
  • 普通文件包含任意数据。应用程序常常需要区分文本文件和二进制文件。
  • 目录是包含一组链接的文件,其中每个链接都将一个文件名映射到一个文件,这个文件可能是另一个目录。每个目录至少含有两个条目:“.” 是到该目自身的链接,以及“…” 是到目录层次结构中父目录的链接。
  • 套接字(socket)是用来与另一个进程进行跨网络通信的文件。
    其他文件类型包含命名通道、符号链接,以及字符和块设备。
  1. 关于打开关闭文件,读写文件等都是代码了,建议直接看书。

  2. 共享文件
    内核用三个相关的数据结构来标识打开的文件:

  • 描述符表。
  • 文件表。每个文件表的表项组成包括当前的文件位置、引用计数(即当前指向该表项的描述符表项数),以及一个指向v-node表中对应表项的指针。
  • v-node表。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  1. 标准I/O库将一个打开的文件模型化为一个流。对于程序员而言,一个流就是一个指向FILE类型的结构的指针。类型为FILE的流是对文件描述符和流缓冲区的抽象。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值