Io

file

file是一个m个字节的序列。所以I/O设备被模型化为文件,输入输出变成读和写。

打开文件

app通过要求内核打开相应文件,访问一个I/O设备,内核返回一个小的非负整数,叫做描述符。内核记录有关这个文件的信息,app只记住这个描述符。

创建进程都有三个打开的文件,stdin,stdout,stderr。

改变当前文件位置,对于每个打开的文件,内核保持一个文件位置k,是从文件开始的字节偏移量。通过seek设置当前位置k。

读写文件

  • 读:从文件复制n>0到内存,从当前位置k增加到k+n,当到末尾,触发EOF
  • 写:从内存复制到n>0到一个文件,从k开始

file type

  • regular file: text and binary
  • directory: 包含一组link的文件,将filename link to one file。至少包括“.” and “..”
  • socket: 与另一个进程进行网络通讯

数据结构

  • 描述符表: 每个进程独立
  • 文件表:打开文件集合,所有进程共享,当前文件位置,引用计数以及指向v-node表中对应的指针
  • v-node:所有进程共享,包含stat结构中的信息

for fork

重定向

dup2 复制oldfd到newfd,删除老的file table item,新的reference count+=1,老的v-node删除


Backlinks