天城建设网站,自己做公司网站需要什么,报个电脑培训班多少钱,电子商务网站设计分析怎么做以下内容源于C语言中文网的学习与整理#xff0c;非原创#xff0c;如有侵权请告知删除。 前言
Linux中一切接文件#xff0c;比如 C 源文件、视频文件、Shell脚本、可执行文件等#xff0c;就连键盘、显示器、鼠标等硬件设备也都是文件。
一个 Linux 进程可以打开成百上…以下内容源于C语言中文网的学习与整理非原创如有侵权请告知删除。 前言
Linux中一切接文件比如 C 源文件、视频文件、Shell脚本、可执行文件等就连键盘、显示器、鼠标等硬件设备也都是文件。
一个 Linux 进程可以打开成百上千个文件为了表示和区分已经打开的文件Linux 会给每个文件分配一个编号这个编号就是一个整数被称为文件描述符File Descriptor。这只是一个形象的比喻并没有解释文件描述符的本质。
本篇文章将从底层实现的角度分析文件描述符看看文件描述符到底是如何表示一个文件的。 Linux 文件描述符到底是什么
一个 Linux 进程启动后会在内核空间中创建一个进程控制块 PCB而 PCB 内部有一个文件描述符表。文件描述符表记录着当前进程所有打开的文件。每个进程都有一个文件描述符表。
除了文件描述符表系统还需要维护另外两张表打开文件表、i-node 表。整个系统只有一个打开文件表一个i-node 表。
文件描述符表、打开文件表、 i-node 表它们三者之间的关系如下图所示。 从本质上讲这三种表都是结构体数组0、1、2、73、1976 等都是数组下标。表头只是我自己添加的注释数组本身是没有的。实线箭头表示指针的指向虚线箭头是我自己添加的注释。
你看文件描述符只不过是一个数组下标
通过文件描述符可以找到文件指针从而进入打开文件表。打开文件表存储了以下信息 1文件偏移量即文件内部指针偏移量。调用 read() 或 write() 时文件偏移量会自动更新也可以使用 lseek() 直接修改。 2状态标志比如只读模式、读写模式、追加模式、覆盖模式等。 3i-node 表指针。 要想真正读写文件需要通过打开文件表的 i-node 指针进入 i-node 表。i-node表包含以下信息 1文件类型例如常规文件、套接字或 FIFO。 2文件大小。 3时间戳比如创建时间、更新时间。 4文件锁。 这里对上图进一步说明 1在进程 A 中文件描述符 1 和 20 都指向同一个打开文件的表项标号为 23指向打开文件表中下标为 23 的数组元素这可能是通过调用 dup()、dup2()、fcntl() 或者对同一个文件多次调用open() 函数形成的。 2进程 A 的文件描述符 2 和进程 B 的文件描述符 2 都指向同一个文件这可能是在调用 fork() 后出现的即进程 A、B 是父子进程关系或者是不同的进程独自去调用 open() 函数打开了同一个文件此时进程内部的描述符正好分配到与其他进程打开该文件的描述符一样碰巧都是2。 3进程 A 的描述符 0 和进程 B 的描述符 3 分别指向不同的打开文件表项但这些表项均指向 i-node 表的同一个条目标号为 1976换言之它们指向了同一个文件。发生这种情况是因为每个进程各自对同一个文件发起了 open() 调用。同一个进程两次打开同一个文件也会发生类似情况。 有了以上对文件描述符的认知我们很容易理解以下情形 1同一个进程的不同文件描述符可以指向同一个文件。 2不同进程可以拥有相同的文件描述符。 3不同进程的同一个文件描述符可以指向不同的文件一般也是这样但除了 0、1、2 这三个特殊的文件。 4不同进程的不同文件描述符也可以指向同一个文件。