inode和文件描述符、文件指针差异
在linux中,内核通过inode来找到每个文件,但一个文件可以被许多用户同时打开或一个用户同时打开多次。这就有一个问题,如何管理文件的当前位移量,因为可能每个用户打开文件后进行的操作都不一样,这样文件位移量也不同,当然还有其他的一些问题。所以linux又搞了一个文件描述符(file descriptor)这个东西,来分别为每一个用户服务。每个用户每次打开一个文件,就产生一个文件描述符,多次打开就产生多个文件描述符,一一对应,不管是同一个用户,还是多个用户。该文件描述符就记录了当前打开的文件的偏移量等数据。所以一个i节点可以有0个或多个文件描述符。多个文件描述符可以对应一个inode。
总结:
- Linux通过inode来查找每个文件。
- 每打开一个文件,对应一个fd,通过fd可以查找到打开的文件的偏移量等数据。
文件描述符、文件指针、inode
Linux中一切皆文件,设备也不例外,有标准输入设备文件,标准输出设备文件等。如下图所示。
从图中可知,内核会在每个进程空间PCB(Process Control Block,进程控制块)中维护一个文件描述符表,所有打开的文件都将通过此表中的文件描述符来引用。其中文件描述符就是这个文件描述符表的下标,每个表项都有一个指向已打开文件的指针。从图中可以看出程序运行起来之后都会默认的打开三个流:
- 标准输入流(stdin:键盘)。
- 标准输出流(stdout:显示器)。
- 标准错误流(stderr:显示器)。
实际上,任何程序运行都会打开标准输入、标准输出和标准错误。
打开文件就会获得文件描述符,它是个很小的正整数。每个进程在PCB(Process Control Block)中保存着一份文件描述符表,文件描述符就是这个表的索引,每个表项都有一个指向已打开文件的指针。
文件指针指向进程用户区中的一个被称为FILE结构的数据结构。
FILE结构包括一个缓冲区和一个文件描述符。而文件描述符是文件描述符表的一个索引,因此从某种意义上说文件指针就是句柄的句柄(在Windows系统上,文件描述符被称作文件句柄)。
FILE结构体如下所示。
-
struct FILE
-
{
-
char *_ptr;//文件输入的下一个位置
-
int _cnt;//当前缓冲区的相对位置
-
char *_base;//指基础位置(文件的起始位置)
-
int _flag;//文件标志
-
int _file;//文件的有效性验证
-
int _charbuf;//检查缓冲区状况,如果缓冲区则不读取
-
int _bufsiz;//文件的大小
-
char *_tmpfname;//临时文件名
-
};
以上。