FILE内容和fd之间的关系

FILE内容和fd之间的关系

注意:fd——文件描述符

           FILE*——文件指针

1. 文件描述符fd

        fd只是一个整数,在open时产生的,起到一个索引的作用。进程通过PCB中的文件描述符表找到该fd所指向的文件指针file,因此在Linux系统下面,文件描述符主要是被用来标识一个文件。内核通过文件对象表来管理系统中各种各样的文件,而文件表则是通过指针来指向打开的文件,进而达到管理整个文件系统的目的。

        其实,通俗来说,在linux系统中打开文件就会获得文件描述符,它是个很小的正整数。每个进程在PCB(Process Control Block)中保存着一份文件描述符表,文件描述符就是这个表的索引,每个表项都有一个指向已打开文件的指针。

详细内容如下图所示:

FILE内容和fd之间的关系_第1张图片
FILE内容和fd之间的关系_第2张图片

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库)





你可能感兴趣的:(FILE内容和fd之间的关系,Linux)