文件描述符(FD)讲解 📁
文件描述符(FD)讲解 📁
什么是文件描述符(FD)?🔍
文件描述符其实感觉还挺常见,挺重要的。OS 这课就不用说了,就是讲这玩意的 📚。再比如说我还在学 Redis 网络模型的时候也遇到了这个东西 💻。接下来我给大家介绍一下 FD。
文件描述符是一个非负整数,它是由操作系统分配给每个打开的文件或 I/O 资源(如普通文件、目录、设备文件、管道、套接字等)的一个唯一标识符 📜。它是进程与这些资源进行交互的主要手段,允许进程执行读取 📖、写入 📝、查找 🔍 等操作。
标准文件描述符 📜
0 - stdin (标准输入):默认连接到键盘 ⌨️。 1 - stdout (标准输出):默认连接到终端屏幕 🖥️。 2 - stderr (标准错误):默认也连接到终端屏幕,但用于显示错误信息 ⚠️。 这三个是每个进程都有的,所以你下一个分配的文件描述符通常会从几开始呢?哎呀好难啊 🤔,不会是 3 吧 🤔。奥~就是 3👍。 OS 默认就是从 0 读,往 1 写。并且 Linux 的命令函数都是单一职责的嘛,那么 man xxx | grep xxx 时,大家知道会怎么样嘛?就是会让 man 函数的 1 与 grep 的 0 相连,形成管道!
文件描述符表(在用户空间)📋
既然对文件描述符有点了解了,那么就必须给大家提一下文件描述符表了,毕竟那一个个的数字得有个地方存放啊 📦。
每个进程都有自己的文件描述符表,该表将文件描述符映射到内核中的文件对象 🔗。文件描述符表存在于用户空间,并且对每个进程都是独立的。每当进程打开一个新的文件或 I/O 资源时,操作系统会在进程的文件描述符表中添加一个新条目,并返回一个唯一的文件描述符给进程 ✨。
系统级文件表(在内核空间)⚙️
其中包含了所有打开文件的状态信息 📚。当进程请求打开一个文件时,操作系统会在系统级别创建一个新的文件表项,并将其与进程的文件描述符关联起来 🔗。 我说白了就是我白说了 🤣。这个系统级文件表,不就是为了隔离用户空间和内核空间吗~ 然后每个进程的文件描述符表中的每个 FD 都指向这个系统级文件表嘛,然后你的进程就能读文件了嘛 📖。
总结 🎉
我感觉上面写的已经挺干了,但其实也很浅,主要是让大家对这它有个印象,当各位在学什么进程间通信啊,Redis 的 IO 多路复用啊 🌐 或文件什么的会更加舒适吧哈哈哈 😄。