假设我打开了一个终端,通过这个终端,我已经cd
'ed到了某个目录.通过另一个终端,我删除该目录,并将其从相同的备份中恢复回来.当我试图从同一目录中的第一个终端删除文件时,为什么会出现文件句柄过时的错误?这是什么意思?(顺便说一句,我发现可以通过cd $(pwd)
绕过这个问题.)
假设我打开了一个终端,通过这个终端,我已经cd
'ed到了某个目录.通过另一个终端,我删除该目录,并将其从相同的备份中恢复回来.当我试图从同一目录中的第一个终端删除文件时,为什么会出现文件句柄过时的错误?这是什么意思?(顺便说一句,我发现可以通过cd $(pwd)
绕过这个问题.)
当目录被删除时,该目录的inode(及其内容的索引 node )将被回收.shell指向该目录的inode(及其内容的inode)的指针现在不再有效.当从备份中恢复目录时,旧的inode被(必要地)重用;目录及其内容存储在随机索引 node 上.唯一不变的是parent目录对恢复的目录重复使用相同的名称(因为您告诉它).
现在,如果您试图访问原始shell仍指向的目录的内容,它会将该请求作为对原始inode的请求传递给文件系统,原始inode已被回收(现在甚至可能用于完全不同的用途).所以你收到stale file handle
条信息,因为你要求一些不存在的数据.
当执行cd
操作时,shell会重新判断给定目标的inode位置.既然shell知道目录的新inode(以及目录内容的新inode),以后对其内容的请求将是有效的.