描述符表
Linux中一切都被抽象成文件,设备也是文件,socket、惯导、消息队列等都是文件。
每个进程都有独立的描述符表。
件描述符就是一个整形变量,表示文件在描述符表中的下标。
每打开一个文件,就会将这个文件的描述符表中。每个进程都有三个默认文件描述符,分别是0(标准输入),1(标准输出),2(标准错误)。
文件描述符一般是调用open()函数返回,调用close()函数会收回对应的文件描述符。
文件表
所有进程共享同一个文件表。
文件表记录了文件的一些信息,比如文件位置、引用计数以及指向v-node表的指针等。
所有打开的文件都有一个文件位置,表示下一次读或写的起始位置。 seek, read, write 函数都可以修改该文件位置。
所有进程共享同一个文件表。文件表中的一个表项可能会被多个描述符指向,引用计数用来表示当前有多少个描述符指向该文件表表项。当调用 close() 函数时,系统会将描述符对应的文件表表项的引用计数减1,然后如果引用计数已经为0,则系统会删除此文件表表项。
v-node表
所有进程共享同一个 v-node 表。
一个 v-node 表的表项对应于一个文件。它记录了文件的元数据信息。包括文件权限,文件大小,文件类型等信息。
当对同一个文件调用多次 open() 函数,那么会产生多个文件表表项,但是只有一个 v-node 表表项。