什么是';陈旧的文件句柄';在Linux中是什么意思?

什么是';陈旧的文件句柄';在Linux中是什么意思?,linux,unix,Linux,Unix,假设我打开了一个终端,并通过该终端将cd”发送到某个目录。通过另一个终端,我删除该目录,并将其从相同的备份中恢复回来。当我尝试从同一目录中的第一个终端vim获取文件时,为什么会得到一个关于过时文件句柄的错误?这是什么意思?(另一方面,我发现可以通过cd$(pwd))绕过这个问题,当目录被删除时,该目录的索引(及其内容的索引节点)被回收。shell指向该目录的inode(及其内容的inode)的指针现在不再有效。当从备份中恢复目录时,旧的inode(不一定)被重用;目录及其内容存储在随机索引节点上

假设我打开了一个终端,并通过该终端将
cd
”发送到某个目录。通过另一个终端,我删除该目录,并将其从相同的备份中恢复回来。当我尝试从同一目录中的第一个终端
vim
获取文件时,为什么会得到一个关于过时文件句柄的错误?这是什么意思?(另一方面,我发现可以通过
cd$(pwd)

绕过这个问题,当目录被删除时,该目录的索引(及其内容的索引节点)被回收。shell指向该目录的inode(及其内容的inode)的指针现在不再有效。当从备份中恢复目录时,旧的inode(不一定)被重用;目录及其内容存储在随机索引节点上。唯一保持不变的是父目录对还原的目录重用相同的名称(因为您告诉它)

现在,如果您试图访问原始shell仍然指向的目录的内容,它会将该请求作为对原始inode的请求传递给文件系统,原始inode已被回收(现在甚至可能用于完全不同的用途)。因此,您会收到一条
stale file handle
消息,因为您请求了一些不存在的数据


当您执行
cd
操作时,shell将重新评估您提供给它的任何目的地的inode位置。既然shell知道目录的新inode(以及目录内容的新inode),以后对其内容的请求将是有效的。

Ah,那么这只是系统处理无效/空inode指针的方法?是的。我对细节知之甚少,不知道如果你试图引用一个已经被回收的inode指向其他东西会发生什么。你还会得到一个陈旧的文件句柄吗?或者您会得到意外的数据?我不认为系统会重用它,因为实际上有人通过将该I节点作为当前目录来使用它。那么如何解决它呢?如果您将一个目录(命名为adir)从主机a装载到主机B,然后在主机a上对adir执行删除和还原操作,您还可能会得到错误“Stale file handle”当您访问主机B上的adir时,使用主机A上的命令
touch
可以使其正常。