FILE内容和fd之间的关系
注意:fd——文件描述符
FILE*——文件指针
1. 文件描述符fd
fd只是一个整数,在open时产生的,起到一个索引的作用。进程通过PCB中的文件描述符表找到该fd所指向的文件指针file,因此在Linux系统下面,文件描述符主要是被用来标识一个文件。内核通过文件对象表来管理系统中各种各样的文件,而文件表则是通过指针来指向打开的文件,进而达到管理整个文件系统的目的。
其实,通俗来说,在linux系统中打开文件就会获得文件描述符,它是个很小的正整数。每个进程在PCB(Process Control Block)中保存着一份文件描述符表,文件描述符就是这个表的索引,每个表项都有一个指向已打开文件的指针。
详细内容如下图所示:
2. 文件指针FILE*
文件指针指向进程的用户空间中的一个FILE机构体,文件指针指向进程用户区中的一个被称为FILE结构的数据结构。FILE结构包括一个缓冲区和一个文件描述符,而文件描述符是文件描述符表的一个索引,因此从某种意义上说文件指针就是句柄的句柄(在Windows系统上,文件描述符被称作文件句柄)。
系统对FILE的结构定义如下:
int fileno(FILE * stream)
FILE * fdopen(int fd, const char * mode)
struct _iobuf {
char *_ptr; //缓冲区当前指针
int _cnt;
char *_base; //缓冲区基址
int _flag; //文件读写模式
int _file; //文件描述符
int _charbuf; //缓冲区剩余自己个数
int _bufsiz; //缓冲区大小
char *_tmpfname;
};
typedef struct _iobuf FILE;
文件指针式C语言的通用的格式,所以相对来说,更加便于移植,我们通常这样来获取文件指针:
FILE * fp=fopen("test.txt","r");
获取到指针以后,我们就可以获得指针当中文件描述符的信息。
注意:文件描述符是唯一的,但是文件指针不是唯一的,文件指针指向的对象是唯一的。
其实,除此之外,我们也应该清楚文件描述符fd和文件指针FILE在系统中所处的位置:
文件描述符:OS层
文件指针:lib层(C库)