文件描述符表详细说明,进程表,进程表与文件描述符表之间的关系,文件描述符的结构(文件IO)【linux】(i)

这篇博客我们说明了文件描述符,读者需要清楚和理解文件描述符结构体里面的成员和功能作用,在后面的博客中会用到这篇博客所涉及的内容。


)

文件描述符表

当open打开文件成功后,会创建相应的结构体(数据结构),用于保存被打开文件的相关信息,对文件进行读写等操作时,会用到这些信息,这个数据结构就是我们要讲的“文件描述符表”。

进程表

(1)前面我们介绍过task_struct结构体,这个结构体又叫进程表。
这个结构体的成员项非常多,多达近300个。
(2)每一个进程运行起来后,Linux系统都会为其在内存中开辟一个task_struct结构体
(3)task_struct专门用于存放进程在运行过程中,所涉及到的所有与进程相关的信息其中,文件描述符表就被包含在了task_struct中。
(4)进程运行结束后,进程表所占用的内存空间,会被释放

task_struct与文件描述符表之间的关系

关系图
在这里插入图片描述

我们给出上图的详细关系图:
在这里插入图片描述

进程表里面的文件描述符表是open函数打开文件之后返回的正在使用的文件描述符。0/1/2默认被使用了。文件描述符就代表我们那么打开的文件,或者说指向我们打开的那个文件。每一个文件描述符对应一个指针,指向的是文件表的地址,文件表是一个结构体,文件表里面放置的就是打开文件之后所涉及的相关的信息。

文件状态标志

open文件时指定的O_RDONLY、O_WRONLY、O_RDWR、O_TRUNC、O_APPEND、O_CREAT、O_EXCL、O_NONBLOCK、O_ASYNC等。

例如:

fd = open("./file1.txt", O_RDWR|O_CREAT|O_EXCL, 0664);

open打开文件成功后,会将文件状态标志保存到“文件表”中。

读写文件时,会先检查“文件状态标志”,看看有没有操作权限,然后再去操作文件。

例如open时指定的是:
O_RDONLY
写(wrtie)文件时,通过fd检查“文件状态标志位”,发现只允许读,写操作会错误返回,并报“不允许写的错误”。我们可以通过perror直接打印出错误原因。

O_WRONLY
读(read)文件时,通过fd检查“文件状态标志位”,发现只允许写,读操作会错误返回,并报“不允许读的错误”。只有当“文件状态标志”允许相应的操作时,读写操作才能成功进行。

文件位移量

文件位移量:文件当前读写位置与文件开始位置的距离(字节数)。
“文件位移量”代表的就是文件读写的位置,read、write读写数据时,通过文件位移量,就知道从哪里开始读写了。

一般情况下打开文件时,文件的位移量默认为0,表示读写的位置在文件头上。

每读写一个字节,文件读写位置(笔尖)就往后移动一个字节,文件位移量随之+1。调用lseek函数调整文件读写位置,其实就是修改文件位移量。

文件长度

文件的大小
在写文件的过程中,每写一个字节的数据到文件中,文件的长度就+1,文件长度也是动态更新的。

函数指针

read、write等操作文件时,会根据底层具体情况的不同,调用不同的函数来实现读写,所以在V节点里面保存了这些不同函数的函数指针,方便调用不同的函数,对于应用程序来说调用的接口是统一的,但是底层硬件不同,就需要使用不同的函数指针去操作不同的底层硬件,直接操作的就是块设备文件。V节点是一个结构体。

i节点信息代表的是文件属性信息。我们在linux平台查看文件属性信息:

通过 ls -l 命令查看:
在这里插入图片描述

我们在这里要说明:V节点和文件表都是由open函数创建的,也会返回相应文件描述符。

O_APPEND

功能
open文件时,如果指定了这个文件状态标志,表示以追加的方式打开文件。 写文件时,会从文件的最末尾开始写操作。
追加的实现原理
文件的位移量代表的,就是文件的读写位置。
open指定了O_APPEND时每次写文件时,都会把“文件位移量”设置为“文件的长度”,也就是说写的位置被调整到了末尾,写文件时从文件尾部进行追加。
每一次写操作后,文件的内容会增加,那么自然文件的长度会被动态更新。
总之,指定了O_APPEND后,每次写文件时,都会使用文件长度去更新文件位移量,保证每次都是从最末尾开始写数据的。

O_APPEND的意义
多次open同一文件,实现共享操作时,指定O_APPEND可以防止数据相互覆盖的发生。

O_TRUNC

如果文件中原来就有数据的话,open打开文件时,会全部被清空。
由于文件已经被清空了,所以将V节点中的文件长度,修改为0

小结

这篇博客我们说明了文件描述符,读者需要清楚和理解文件描述符结构体里面的成员和功能作用,在后面的博客中会用到这篇博客所涉及的内容。

发布了84 篇原创文章 · 获赞 71 · 访问量 9115

猜你喜欢

转载自blog.csdn.net/qq_43648751/article/details/104151249