关闭描述符意味着什么?

时间:2013-11-19 23:17:41

标签: unix file-descriptor

我认为描述符只是全局文件表中的数字索引,所以我对“关闭描述符”实际意味着什么感到困惑。有人可以澄清进程,描述符和打开文件之间的关系,并解释打开,复制和关闭描述符的含义吗?

1 个答案:

答案 0 :(得分:0)

描述符是一种键。当您想要访问某个房间时,您需要获取它的密钥。 open通过为您提供密钥来授予您访问房间(文件)的权限。

要访问(read / write)您需要密钥的房间(文件)。

然后公平(系统中的密钥数量有限),当你不再需要访问房间时,你应该释放密钥(close描述符)。因此,密钥现在可供全球其他客户使用......

对于进程(客户端)想要访问的所有资源,这是相同的。获取密钥,使用密钥,释放资源的密钥。您可以拥有许多不同的密钥集:文件密钥,内存密钥等。

系统是密钥的所有者并管理它们,处理询问系统的密钥并使用它们。

复制只是提供密钥共享的一种方式。两个进程可以使用相同的密钥进入房间。如果您想了解共享这样一个密钥的确切含义,您需要了解一个打开的文件究竟是什么。

事实上,系统给你带来的不仅仅是现实生活中的简单钥匙。描述符是系统表中的一个条目,用于描述正在操作的文件的状态。当您打开文件时,会分配一些数据。

  • 首先在进程自己的空间中,初始化一些数据以准备进程能够操作文件。这些数据放在进程的描述符表中。您的描述符正是该表中的索引。该条目引用系统打开文件表。
  • 秒系统跟踪其打开文件表中的所有已打开文件。在这样的表条目中,您有许多数据可以帮助系统实现文件所需的操作(它是哪个文件,缓冲区缓存结构,文件的当前位置,当前打开模式等)。

现在,在许多情况下,只有一个与系统条目关联的进程条目。但情况并非总是如此!想想在同一个终端上写两个不同的进程,然后在每个进程中你有一个描述符来表示它对终端的访问(在Unix中一个终端只是一个文件),但是这两个条目都指向同一个系统表条目,包含说明它是哪个终端等的数据

dup许可描述符确实完全符合这种情况:在同一进程中有2个条目指向同一个系统条目。 dup许可描述符的另一种方法是fork进程,克隆进程,克隆克隆进程描述符表...这是两个进程共享同一终端的方式。第一个进程(可能是shell)打开终端,然后fork执行子命令,以便子命令可以访问同一个终端。