Unix 关闭描述符意味着什么?

Unix 关闭描述符意味着什么?,unix,file-descriptor,Unix,File Descriptor,我认为描述符只是全局文件表中的数字索引,所以我对“关闭描述符”的实际含义感到困惑。有人能澄清进程、描述符和打开文件之间的关系,并解释打开、复制和关闭描述符的含义吗?描述符是一种键。当你想进入某个房间时,你需要拿到钥匙打开通过给您房间(文件)的钥匙,授予您访问该房间(文件)的权限 要访问(读取/写入)房间(文件),您需要钥匙 然后为了公平起见(系统中的钥匙数量是有限制的),当您不再需要访问房间时,您应该释放钥匙(close描述符)。因此,密钥现在在全球范围内可供其他客户使用 这对于流程(客户端)要

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

描述符是一种键。当你想进入某个房间时,你需要拿到钥匙<代码>打开通过给您房间(文件)的钥匙,授予您访问该房间(文件)的权限

要访问(
读取
/
写入
)房间(文件),您需要钥匙

然后为了公平起见(系统中的钥匙数量是有限制的),当您不再需要访问房间时,您应该释放钥匙(
close
描述符)。因此,密钥现在在全球范围内可供其他客户使用

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

系统是密钥的所有者并对其进行管理,处理向系统请求密钥并仅使用它们

因为复制只是提供密钥共享的一种方式。两个进程可以使用同一把钥匙进入房间。如果您想了解共享这样一个密钥到底意味着什么,那么您需要了解打开的文件到底是什么

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

  • 首先,在进程自己的空间中,初始化了一些数据,以使进程能够处理文件。这些数据放在流程描述符表中。您的描述符正是该表中的索引。该条目引用系统打开的文件表
  • 其次,系统跟踪其打开的文件表中所有打开的文件。在这样一个表条目中,有许多数据可以帮助系统实现对文件的操作(它是哪个文件、缓冲区缓存结构、文件的当前位置、当前打开模式等)
现在在许多情况下,只有一个流程条目与系统条目相关联。但事实并非总是如此!假设两个不同的进程在同一个终端上写入,那么在每个进程中都有一个描述符,表示它对终端的访问(在Unix中,终端只是一个文件),但这两个条目都指向同一个系统表条目,其中包含表示它是哪个终端的数据,等等

dup
应用描述符可以准确地实现这种情况:在同一流程中,有两个条目指向同一系统条目。另一种复制描述符的方法是将一个进程,克隆一个进程,克隆一个进程描述符表。。。例如,这就是两个进程共享同一个终端的方式。第一个进程(可能是一个shell)打开终端,然后
fork
s执行子命令,以便子命令可以访问同一终端