Linux系统中的文件描述符实际上是如何应用于执行读和写操作的I/O模块是否使用文件描述符信息向适当的文件写入或读取数据
vyswwuz21#
文件描述符是一个数字。它是一个索引,指向内核空间中存在的已打开文件的数组。每个进程都有一个这样的数组(除非它们决定共享)。该数组包含指向file struct的指针-一种表示打开的文件、设备或网络套接字的内核结构。该结构包含许多簿记字段,甚至可以由拥有该文件的驱动程序扩展。但最重要的字段是file operations-该字段包含指向系统调用背后的实际代码的函数指针列表-每个系统调用一个。是的,相同的系统调用可以调用不同的代码取决于文件的类型:常规文件将从文件系统驱动程序调用函数,网络套接字将从网络驱动程序调用函数,等等。所以整个过程是这样的:1.你调用系统调用,给它给予 * 文件描述符。*1.系统调用索引当前进程的 * 已打开文件数组 *。如果该索引项未打开-返回错误。1.系统调用获取 file struct 指针,并检索指向请求操作的函数指针。如果该操作不支持-返回错误。1.调用函数。将文件结构体指针和所有参数传递给函数。你可能会问-为什么这么多的并发症?为什么不只是通过一个file *到系统调用?这是为了安全-如果用户程序可以以某种方式操纵文件结构,或指向内核到一个假的-它可以访问任何文件,完全绕过任何安全检查。这就是为什么有一定程度的间接性很重要,这是完全在内核保护的内存-用户程序没有访问。
file *
1条答案
按热度按时间vyswwuz21#
文件描述符是一个数字。它是一个索引,指向内核空间中存在的已打开文件的数组。每个进程都有一个这样的数组(除非它们决定共享)。
该数组包含指向file struct的指针-一种表示打开的文件、设备或网络套接字的内核结构。该结构包含许多簿记字段,甚至可以由拥有该文件的驱动程序扩展。但最重要的字段是file operations-该字段包含指向系统调用背后的实际代码的函数指针列表-每个系统调用一个。是的,相同的系统调用可以调用不同的代码取决于文件的类型:常规文件将从文件系统驱动程序调用函数,网络套接字将从网络驱动程序调用函数,等等。
所以整个过程是这样的:
1.你调用系统调用,给它给予 * 文件描述符。*
1.系统调用索引当前进程的 * 已打开文件数组 *。如果该索引项未打开-返回错误。
1.系统调用获取 file struct 指针,并检索指向请求操作的函数指针。如果该操作不支持-返回错误。
1.调用函数。将文件结构体指针和所有参数传递给函数。
你可能会问-为什么这么多的并发症?为什么不只是通过一个
file *
到系统调用?这是为了安全-如果用户程序可以以某种方式操纵文件结构,或指向内核到一个假的-它可以访问任何文件,完全绕过任何安全检查。这就是为什么有一定程度的间接性很重要,这是完全在内核保护的内存-用户程序没有访问。