文件指针和文件描述符

文件指针和文件描述符

文件指针:
概念:一个指针遍历指向文件,通过文件指针获取该文件的信息,在C语言中,通常使用文件指针作为I/O句柄
一般形式:FILE* 指针变量标识符,常用FILE* fp
头文件:#include<frstream.h> 文件输入输出流
文件指针本质是一个结构体,是由系统自定义的,所以结构体不需要自己定义,我们可以直接调用
例如:

//构建一个文件指针
FILE* fp =nullptr;
fp=fopen(file.c_str(),"rb");
if(fp == nullptr) //判断文件是否打开

文件指针其实不难理解,而是涉及操作也很简单,主要是和I/O流中一些函数一起使用,那么接下来要看一看文件描述符

文件描述符:
实际文件描述符是文件指针结构体中的一员,也就是说在Linux系统中文件指针是文件描述符的封装,文件描述符是作为该结构体的一个系统调用接口。
虽然系统已经定义了文件描述符,哪有为什么给文件描述符定义结构体呢?
封装的好处:
1.方便使用
2.有利于提高代码的可植性

  • 文件描述符在Linux下的使用原理:

在Linux系统中打开文件就会获得文件描述符,它是个很小的正整数。每个进程在PCB
中保存着一份文件描述符表,文件描述符就是这个表的索引,每个表项都有一个指向已打开文件的指针,已打开的文件在内核中用file结构体表示,文件描述符表中的指针指向file结构体。

文件指针和文件描述符

文件描述符分配规则:
从最小一位没有被分配的整数开始分配
标准输入(stdin)的文件描述符是 0
标准输入(stdout)的文件描述符是 1
标准输入(stderr)的文件描述符是 2

注:文件描述符的有效范围是 0 到 OPEN_MAX。一般来说,每个进程最多可以打开64 个文件(0 — 63)。对于 FreeBSD 5.2.1、Mac OS X 10.3 和 Solaris 9 来说,每个进程最多可以打开文件的多少取决于系统内存的大小,int 的大小,以及系统管理员设定的限制。Linux 2.4.22 强制规定最多不能超过 1, 048, 576 。

文件描述符的优点以及缺点:
优点:兼容POSIX标准,在UNIX、Linux的系统调用中,大量的系统调用都是依赖于文件描述符。
缺点:
1、仅适用于Unix/Linux
2、文件描述符为整数表示,当代码量增大时,难以区分数据与文件描述符,因此会降低代码可读性