Tengo dos conchas abiertas. El primero está en el directorio A. En el segundo, elimino el directorio A y luego lo vuelvo a crear. Cuando vuelvo al primer shell y escribo ls
, la salida es:
ls: cannot open directory .: Stale file handle
¿Por qué? Pensé que el primer shell (el que permanecía abierto dentro de un directorio inexistente) se "congelaría" mientras esperaba el siguiente comando, y no se habría "dado cuenta" de que el directorio fue eliminado y recreado. ¿El shell contiene una referencia "más profunda" a su directorio de trabajo actual que no sea la cadena $PWD
?
bash
filesystems
open-files
pwd
fonini
fuente
fuente
cd $PWD
.Respuestas:
Un directorio (como cualquier archivo) no está definido por su nombre. Pensar en el nombre como el del directorio de direcciones . Cuando mueve el directorio, sigue siendo el mismo directorio, al igual que si se muda a una casa diferente, sigue siendo la misma persona. Si elimina un directorio y crea uno nuevo con el mismo nombre, es un directorio nuevo, al igual que alguien que se muda a la casa donde solía vivir, ¿no es usted?
Cada proceso tiene un directorio de trabajo . El
cd
comando en el shell cambia el directorio de trabajo actual del shell. Elpwd
comando imprime la ruta to al directorio de trabajo actual.Cuando eliminó el directorio A, lo que hizo fue eliminar la entrada de A en su directorio principal. El directorio A permaneció en el sistema de archivos, pero en un estado separado, sin nombre. Todavía no se eliminó porque estaba en uso por un proceso, es decir, el primer shell. Cuando cambió el directorio en el primer shell, el directorio finalmente se eliminó. Lo mismo sucede cuando se elimina un archivo mientras un proceso todavía lo tiene abierto: la entrada del directorio del archivo se elimina inmediatamente y el archivo en sí se elimina cuando deja de estar en uso.
Del mismo modo, observe lo que sucede cuando mueve los directorios.
En otro caparazón:
En el primer caparazón:
El archivo
1
está en el directorio que originalmente se llamóone
y ahora se llamatwo
. El archivo2
está en el directorio que originalmente se llamótwo
y ahora se llamaone
.¹ Más precisamente, una ruta, que puede no ser única si están involucrados enlaces simbólicos u otras sutilezas.
fuente
/proc/<pid>/cwd
, que funciona como/proc/<pid>/fd/<number>
. EstáCWD
en la salida delsof
.cd - && cd -
en tal caso?El nuevo directorio A no es el mismo que el directorio A. Se puede verificar con el
stat
comando antes de eliminar el antiguo y después de crear uno nuevo y verá diferentes números de i-node.Y creo que esto está relacionado con el funcionamiento del núcleo. Simplemente realiza un seguimiento del número i del directorio actual para cada proceso. Entonces, como hay diferentes números i, esto conducirá a diferentes colisiones.
fuente
Este es el comportamiento esperado. El nuevo directorio A no es el mismo que el antiguo directorio A, simplemente tiene el mismo nombre. Entonces, el $ PWD de la primera terminal aún no está, no apareció mágicamente cuando lo hizo
mkdir A
.fuente
Un directorio, como un archivo, tiene un inodo asociado:
307% mkdir ABC
308% ls -i 11997708 A 11997709 B 11997710 C
Un inodo es una estructura de datos que contiene información sobre el directorio o archivo. Cada directorio y archivo tiene uno. Piense en ello como una dirección (un número de índice realmente).
Si estoy en A, número de inodo 11997708 y en otro shell (o en el mismo shell que voy a hacer) borre el directorio A y luego vuelva a crearlo y ls el inodo:
309% cd A
310% rmdir ../A
311% mkdir ../A
312% ls -i ..
11997720 A 11997709 B 11997710 C
El nodo i es diferente, por lo que si intenta crear un archivo en el directorio eliminado A:
313% toca esto
touch: no se puede tocar 'this': no existe tal archivo o directorio
porque el directorio en el que estoy - ya no está asociado con el inodo 11997720 - por lo que actualmente ya no tengo una dirección / índice legítimo - inodo. De ahí el error.
fuente