- 一个应用程序通过要求内核打开相应的文件,来宣告自己要访问一个I/O设备。内核返回一个非负整数,成为文件描述符。内核会记录该描述符的所有信息
- Linux shell会给每个进程分配三个文件描述符 0标准输入 1标准输出 2标准错误
文件类型
linux文件类型分为
-
普通文件 普通文件包括文本文件和二进制文件
-
目录 目录是包含一组链接的文件,其中每个链接都将一个文件名映射到一个文件
-
套接字 用来与另一个进程进行跨进程通信的文件
共享文件
内核如何表示打开的文件
- 由三个数据结构表示
- 描述符表 每个进程都有一个文件描述符表,并以文件描述符作为索引
- 文件表 打开文件的集合是由一张表表示的,所有进程共享这张表,每一个表项包含当前文件的位置,引用计数,以及一个v-node表中对应表项的指针,进程关闭一个文件,表项中的引用计数会减一,当为0时,内核会删除该表项
- v-node表 同文件表一样,每个进程共享一张表,每个表项包含stat结构大多数信息,包含了文件的类型和对于文件操作函数的指针
多个文件描述符可以通过不同的表项来引用同一个文件(只要打开同一个文件两次,两个不同的fd)
父子进程共享文件