Linux:文件描述符(09)

63 阅读2分钟

Linu操作系统中的一切都被抽象成文件,既然如此,那么如何操作Linux中的文件呢?就是文章的标题:文件描述符(file descriptor,简称fd)。没错,当进程打开一个文件或新建一个文件时,Linux内核会返回一个文件描述符给当前进程以对应这个打开或新建的文件。而每个进程是使用文件描述符表来维护这些打开或新建的文件的。在Linux中,文件描述符本质是一个整数,每个进程都有各自的文件描述符表。

1.虚拟地址空间

所谓虚拟地址空间,就是操作系统的内存管理单元为了维护物理内存的“秩序”而设立的一种内存管理机制,每个进程都有自己独立的虚拟地址空间,它通过MMU(内存管理单元)映射到物理内存上面。有了虚拟地址空间之后,每个进程就能“无忧无虑”地使用自己的内存空间...

虚拟地址空间的组成:内核区和用户区;内核空间为内核保留,不允许应用程序读写该区域的内容或直接调用内核代码定义的函数,只能通过系统调用该函数才能访问内核区;用户区用于存储进程运行时用到的各种数据

image.png

2.文件描述符

在虚拟地址空间中的内核区,用作进程管理的区域本质上是一个进程控制块(Process Control Block,简称PCB),里边包含管理进程的各种信息,其中有一个结构体叫struct file,就是一个文件描述符表,用于存储当前进程所管理的所有文件描述符

文件描述符表中默认分配的文件描述符有三个:

  • STDIN_FILENO:标准输入,可以通过这个文件描述符将数据输入到终端文件中(0)
  • STDOUT_FILENO:标准输出,可以通过这个文件描述符将数据通过终端输出出来(1)
  • STDERR_FILENO:标准错误,可以通过这个文件描述符将错误信息通过终端输出出来(2)

因此,进程每打开一个文件,就会从3开始,向这个结构体中添加一个文件描述符,因此可以这样理解文件描述符:一个文件描述符对应磁盘的一个文件,或对应一个抽象成文件的设备!!!