1.I/O

  • 输入/输出(I/O) : 是指主存和外部设备(如磁盘,终端,网络)之间拷贝数据过程
  1. 高级别I/O函数,包括scanf和printf,«和»,以及使用系统级I/O函数实现
  • 一个Unix 文件就是一个m个字节的序列:
  1. 所有I/O设备都被模型化为文件
  2. 而所有的输入和输出都被当做相应文件的读和写

2.文件

  • 为了区别不同文件的类型,会有一个 type 来进行区别
  1. 普通文件: 包含任意数据
  2. 目录: 相关一组文件的索引
  3. 套接字 Socket: 和另一台机器上的进程通信的类型
  • 打开和关闭文件

每个由 Linux shell创建的进程都会默认打开三个文件:

  1. standard input(stdin)-标准输入文件-0
  2. standard output(stdout)-标准输出文件-1
  3. standar error(stderr)-标准错误文件-2
  4. 所以用户打开的文件的最小进程号是3
  • 内核用三个相关的数据结构来表示打开的文件
  1. 描述符表 每个进程都有它独立的描述符表,它的表项是由进程打开的文件描述符来索引的。每个打开的描述符表项指向文件表中的一个表项

  2. 文件表 打开文件的集合是由一张文件表来表示的,所有的进程共享这张表。每个文件表的表项组成包括当前的文件位置、引用计数refcnt(即当前指向该表项的描述符表项数),以及一个指向v-node表中对应表项的指针。关闭一个描述符会减少相应的文件表表项中的引用计数。内核不会删除这个文件表表项,直到它的引用计数为零

  3. v-node表 同文件表一样,所有的进程共享这张v-node表。每个表项包含stat结构中的大多数信息,包括st_mode和st_size成员

3.重定向

  • I/O重定向功能: 允许用户将磁盘文件和标准输入输出联系起来

  • 使用dup2函数,

    int dup2(int oldfd,int newfd);

  1. 若成功则为非负的描述符,若出错则为-1。

  2. dup2函数拷贝描述符表表项 oldfd 到描述符表表项 newfd ,覆盖newfd。

  3. 如果newfd已经打开,dup2函数会在拷贝oldfd之前关闭newfd