Unix IO

一个 Linux 文件就是一个 m个字节的序列。
所有的I/O设备(例如网络、磁盘和终端)都被模型化为文件,而所有的输入和输出都被当作对相应文件的读和写来执行。这种将设备优雅地映射为文件的方式,允许Liunx内核引出一个简单、低级的应用接口,称为 Unix I/O ,这使得所有的输入和输出都能以一种统一且一致的方式来执行:

  • 打开文件。一个应用程序通过要求内核打开相应的文件,来宣告它想要访问一个I/O设备。内核返回一个小的非负整数,叫做描述符,它在后续对此文件的所有操作中标识这个文件。内核记录有关这个打开文件的所有信息。应用程序只需要记住这个描述符。
  • Liunx 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。
  • 关闭文件。当应用完成了对文件的访问之后,它就通知内核关闭这个文件。作为响应,内核释放文件打开时创建的数据结构,并将这个描述符恢复到可用的描述符池中。无论一个进程因为何中原因终止时,内核都会关闭所有打开的文件并释放它们的内存资源。

每个Liunx文件都有一个类型(type)来表明它在系统中的角色:

  • 普通文件
  • 目录
  • 套接字(socket) 是用来与另外一个进行跨网络通信的文件。
  • 命名通道
  • 符号链接
  • 字符
  • 块设备

存储单位

二进制序列用以表示计算机、电子信息数据容量的量纲,基本单位为字节B,字节向上分别为KB、MB、GB、TB,每级为前一级的1024倍,比如1KB=1024B,1M=1024KB.
位 bit(比特):存放一个二进制数,即0或1,最小的存储单位。英文缩写:b(固定小写)
字节byte:8个二进制位为一个字节(B),最常用的单位。