什么是文件描述符,文件描述符池 ,open的文件描述符 与 fopen的文件指针的关系【linux】(d)
什么是文件描述符,文件描述符池 , open的文件描述符 与 fopen的文件指针的关系
什么是文件描述符
open成功就会返回一个非负整数(0、1、2、3…)的文件描述符,比如我们示例程序中FileRW.c返回的文件描述符是3。
执行结果为:
文件描述符指向了打开的文件,我们这里指向的是file.txt这个文件,后续的read/write/close等函数的文件操作,都是通过文件描述符来实现的。
上面的fd我们在这里已经知道的情况下可以直接写成3,但是我们在实际的过程中还是会使用fd,这样我们就不需要具体的fd的值,即使之后fd的值改变了也没有任何影响。
文件描述符池
每个程序运行起来后,就是一个进程,系统会给每个进程分配0到1023的文件描述符范围,也就是说每个进程打开文件时,open所返回的文件描述符,是在0~1023范围中的某个数字。
0~1023这个文件描述符的范围,其实就是文件描述符池。
1023这个上限可不可以改?
可以,但是没有必要,也不会介绍如何去改,因为一个进程基本不可能出现,同时打开1023个文件的情况,文件描述符的数量百分百够用。
在我们的例子中,为什么open返回的是3 ?
open返回文件描述符是由规则的:
open返回文件描述符池中,当前最小没用的哪一个。进程一运行起来,0/1/2默认就被使用了,最小没被用的是3,所以返回3。如果又打开一个文件,最小没被用的就应该是4,所以open返回的应该是4。
运行结果为:
我们这里不进行报错判断,只是说明下一个文件描述符open返回文件描述符池中,当前最小没用的哪一个3被用了,那么下一个就是4。
文件描述符0、1、2被用来干嘛了,后面解释。
文件关闭后,被文件用的描述符会被释放,等着下一次open时,被重复利用。
如果我们打开一个文件,记录下来文件描述符之后再打开其他文件记录描述符,那么打印的文件描述符结果应该是一样的,因为上一个文件在关闭的时候文件描述符进行释放,在后面再次进行文件打开的时候按照规则适用文件描述符。代码演示如下:
运行结果如下:
open的文件描述符 与 fopen的文件指针的关系
open:Linux 的系统函数(文件io函数)
open成功后,返回的文件描述符,指向了打开的文件。
)fopen:C库的标准io函数
#include <stdio.h>
FILE *fopen(const char *path, const char *mode);
fopen成功后,返回的是FILE *的文件指针,指向了打开的文件。
我们可以通过帮助手册进行查看;
参数说明如下;
对于Linux的C库来说,fopen 这个C库函数,最终其实还是open函数来打开文件的fopen只是对open这个函数做了二次封装。
也就是说,fopen的文件指针,最终还是会被换成open的文件描述符,然后用于去操作打开的文件。说到C库的标准io函数时,会详细介绍文件指针与文件描述符之间的关系。