![文件描述符和软/硬链接之间的区别](https://linux22.com/image/154351/%E6%96%87%E4%BB%B6%E6%8F%8F%E8%BF%B0%E7%AC%A6%E5%92%8C%E8%BD%AF%2F%E7%A1%AC%E9%93%BE%E6%8E%A5%E4%B9%8B%E9%97%B4%E7%9A%84%E5%8C%BA%E5%88%AB.png)
如果软链接和硬链接都是指向文件的指针。
文件描述符是指向打开文件的文件句柄。
如果两者都是指向文件的指针,那么两者之间到底有什么区别呢?
此外,硬链接指向文件内容的地址位置,文件描述符也指向文件内容,那么这里到底有什么不同。硬链接也有自己的文件描述符。
答案1
从哲学上讲,可以说它们没有不同。
但它们在使用和实施的原因、地点和方式上完全不同。
首先,硬链接和软/符号链接都是目录条目,即它们是称为目录的特殊格式文件中的条目/记录,其中每个记录都保存一个名称和一个索引节点号——后者指的是保存该目录的真实结构。文件的元数据(权限、大小等)和数据块列表——称为“inode”的结构。
硬链接和符号链接之间的区别在于,硬链接指向的索引节点包含实际数据,而符号链接指向的索引节点包含另一个文件的路径。基本上,符号链接本身就是难的指向特殊类型文件的链接,就像命名管道、unix 域套接字文件等。
现在,当内核打开一个文件时,它会创建一个内存中结构,从磁盘复制 inode,并包含一些相同的元数据(权限、包含数据的块列表、大小等)。该结构由另一个称为“打开文件描述”的结构指向(它保存诸如位置指针之类的内容,文件是以读写模式还是只读模式打开的,是否应该以非阻塞方式读写)模式等)。最后,该结构由另一个内核(每个进程)结构中的条目指向,该结构是一个称为文件描述符表的数组/表。
“文件描述符”(由 open(2) 等系统调用返回的整数)是该表的索引。
内存中的索引节点可以由多个“打开文件描述”指向,而多个“打开文件描述”本身可以由来自多个进程的多个文件描述符指向。
一些系统调用(例如 open(2))会特殊对待符号链接——当它们打开的文件原来是符号链接时,它们会继续尝试打开由其内容路径命名的文件。
磁盘结构(目录、索引节点)和内核/内存结构(索引节点、打开文件描述)都使用引用计数来跟踪哪个结构正在使用哪个结构。 (不,内核中没有任何标记和清除垃圾收集器,它会跳转内存或磁盘上的指针来确定哪些对象不再从其他任何地方引用;-))。