假设我打开了一个终端,通过这个终端,我已经cd'ed到了某个目录.通过另一个终端,我删除该目录,并将其从相同的备份中恢复回来.当我试图从同一目录中的第一个终端删除文件时,为什么会出现文件句柄过时的错误?这是什么意思?(顺便说一句,我发现可以通过cd $(pwd)绕过这个问题.)

推荐答案

当目录被删除时,该目录的inode(及其内容的索引 node )将被回收.shell指向该目录的inode(及其内容的inode)的指针现在不再有效.当从备份中恢复目录时,旧的inode被(必要地)重用;目录及其内容存储在随机索引 node 上.唯一不变的是parent目录对恢复的目录重复使用相同的名称(因为您告诉它).

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

当执行cd操作时,shell会重新判断给定目标的inode位置.既然shell知道目录的新inode(以及目录内容的新inode),以后对其内容的请求将是有效的.

Linux相关问答推荐

C++17/Linux:信号未解锁单独线程中被阻止的网络套接字调用

Arch_prctl的用例是什么

如何在 shell 脚本中自定义 SFTP 详细输出

为什么 `std::this_thread::yield()` 比 `std::this_thread::sleep_for(0s)` 慢 10 倍?

读取命令停止执行 bash 脚本

在 bash 中解析变量

bash 更有效的方法来转换奇数日期格式以被 linux 日期识别

在 SLURM 作业(job)脚本中设置和传递字符串变量

在 Linux 中 Select 多个同名的可执行文件

需要解释 Linux bash 内置 exec 命令行为

如何使用不同的出口 IP 一次运行多个 Tor 进程?

将 awk 输出保存到变量

如何仅使用 SED 获得第二行

为什么 XGrabKey 会生成额外的聚焦和聚焦事件?

什么是最有效的不区分大小写的 grep 用法?

Linux 上的 C++ 开发 - 我从哪里开始?

在 C 中检测 64 位编译

C ++中套接字上的协议缓冲区

如何在 IE 中使用 Linux 进行测试

将 BlueZ Stack 用作外设(广告商)