说到文件指针,大多数人都知道它的类型为FILE* ,但不熟悉FILE是一种怎样的结构,而对于文件描述符,它是system call 中对文件进行基本操作(open、close、write等)的一种描述,相当于C库中的文件指针,即文件描述符对应于system call,而文件指针则对应于C库;
首先介绍一下FILE(FILE是一个结构,它包含以下成员)
struct _iobuf{
char *_ptr; //文件输入的下一个位置
int _cnt; //当前缓冲区的相对位置
char *_base; //基础位置(指文件的起始位置)
int _flag; //文件标志
int _file; //文件的有效性验证
int _charbuf; //检查缓冲区状况,若无缓冲区则不读取
int _bufsiz; //文件大小
char *_tmpfname; //临时文件名
};
typedef struct _iobuf FILE;
我们都知道,使用库函数fopen()将返回一个指向FILE结构的指针,实际上,这个FILE结构体包含处理文件的信息,而文件描述符(一个非负整数)就是这个FILE结构体中的一个成员,即成员_file,_file是一个数组(打开文件列表)下标(索引),该数组(文件列表)的每一个元素都包含一个文件控制块(FCB),操作系统用其来管理特定的文件;
如下图所示:
因此,C库中FILE结构体中封装了system call中的文件描述符,且文件描述符起着至重要的作用;