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

假设我有一个打开的终端,通过该终端,我有 cd’到某个目录。通过另一个终端,我删除该目录,并从相同的备份恢复它。当我从第一个终端尝试 vim文件时,在同一个目录下,为什么我会得到一个关于陈旧文件句柄的错误?这是什么意思?(另外,我发现可以通过 cd $(pwd)绕过这个问题。)

287149 次浏览

删除该目录时,将回收该目录的 Inode(及其内容的 inode)。Shell 指向该目录的 inode (及其内容的 inode)的指针现在不再有效。当从备份中恢复目录时,旧的索引节点将被重用(必然) ; 目录及其内容将存储在随机索引节点上。唯一保持不变的是 家长目录对还原的目录重用相同的名称(因为您要求它这样做)。

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

执行 cd操作时,shell 将重新计算所给目标的 inode 位置。现在您的 shell 已经知道目录的新 inode (以及其内容的新 inode) ,以后对其内容的请求将是有效的。