索引节点号、文件描述符、句柄在形式上都是一个非负整数,它们的机制为何

来源:互联网 发布:印度教知乎 编辑:程序博客网 时间:2024/05/22 21:14

1、系统给每个索引节点分配了一个号码,(该号码)也就是该节点在索引节点数组(即inode table)中的索引号(即数组下标号),称为索引节点号。

[Linux 中的 VFS 文件系统之基础知识:挂载的含义]


2、文件描述符在形式上是一个非负整数。实际上,它是一个索引(关键)值(或叫索引主键值),指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。但是文件描述符这一概念往往只适用于UNIX、Linux这样的操作系统。

优点

文件描述符的优点主要有两个:

  • 基于文件描述符的I/O操作兼容POSIX标准。
  • 在UNIX、Linux的系统调用中,大量的系统调用都是依赖于文件描述符。
如,fd <span class="sy0">=</span> open<span class="br0">(</span>path<span class="sy0">,</span> O_CREAT <span class="sy0">|</span> O_RDONLY<span class="sy0">,</span> <span class="nu8">0644</span><span class="br0">)</span><span class="sy0">;中的fd就是一个文件描述符。</span>

缺点

文件描述符的概念存在两大缺点:

  • 在非UNIX/Linux操作系统上(如Windows NT),无法基于这一概念进行编程。
  • 由于文件描述符在形式上不过是个整数,当代码量增大时,会使编程者难以分清哪些整数意味着数据,那些意味着文件描述符。因此,完成的代码可读性也就会变得很差,这一点一般通过消除魔术数字来解决。
参考:http://zh.wikipedia.org/zh/%E6%96%87%E4%BB%B6%E6%8F%8F%E8%BF%B0%E7%AC%A6


像上面提到的索引节点号文件描述符,还有windows系统里的句柄在形式上都是一个非负整数,他们的机制基本类似,如下图所示:


比如,我们创建一个句柄时,其实就是在某个索引对象里创建了一行数据,该行数据的第一列的值即索引号值(即句柄值)是操作系统(随机)生成的,第二列值即指针,该指针指向一个数据结构对象,这个数据结构对象才是创建一个句柄时真正要创建的内容。为什么不直接用一个指针来指向这个数据结构对象呢?因为这样程序员就可以看到这个数据结构对象的结构是什么,所以微软公司为了不让人看到它开发的这个数据结构对象结构(这是微软的秘密),就只是给程序员一个可以间接找到这个数据结构对象的句柄值。操作系统可以根据这个句柄值去查找某一个索引对象,但是程序员无法知道操作系统去查找什么的索引对象,这样程序员无法知道操作系统去查找什么的索引对象也就不能(根据这个索引对象)找到那个数据结构对象。
0 0