Eu tenho duas conchas abertas. O primeiro está no diretório A. No segundo, removo o diretório A e o recrio. Quando eu volto para o primeiro shell e digito ls
, a saída é:
ls: cannot open directory .: Stale file handle
Por quê? Eu pensei que o primeiro shell (aquele que permanecesse aberto dentro de um diretório inexistente) "congelaria" enquanto aguardava o próximo comando e não teria "percebido" que o diretório foi excluído e recriado. O shell contém uma referência "mais profunda" ao seu diretório de trabalho atual que não seja a string $PWD
?
bash
filesystems
open-files
pwd
fonini
fonte
fonte
cd $PWD
.Respostas:
Um diretório (como qualquer arquivo) não é definido por seu nome. Pense no nome como o endereço do diretório . Quando você move o diretório, ele ainda é o mesmo diretório, assim como se você se mudar para uma casa diferente, você ainda é a mesma pessoa. Se você remover um diretório e criar um novo com o mesmo nome, será um novo diretório, assim como alguém que se muda para a casa onde você morava, não é você.
Cada processo possui um diretório de trabalho . O
cd
comando no shell altera o diretório de trabalho atual do shell. Opwd
comando imprime o caminho para o diretório de trabalho atual.Quando você removeu o diretório A, o que isso fez foi remover a entrada de A em seu diretório pai. O próprio diretório A permaneceu no sistema de arquivos, mas em um estado desanexado, sem nome. Ainda não foi excluído porque estava em uso por um processo, ou seja, o primeiro shell. Quando você alterou o diretório no primeiro shell, o diretório foi finalmente excluído. O mesmo ocorre quando um arquivo é excluído enquanto um processo ainda o abre: a entrada de diretório do arquivo é removida imediatamente e o próprio arquivo é removido quando deixa de ser usado.
Da mesma forma, observe o que acontece quando você move os diretórios.
Em outra concha:
No primeiro shell:
O arquivo
1
está no diretório que foi originalmente chamadoone
e agora é chamadotwo
. O arquivo2
está no diretório que foi originalmente chamadotwo
e agora é chamadoone
.Precisely Mais precisamente, um caminho, que pode não ser exclusivo se houver links simbólicos ou outras sutilezas.
fonte
/proc/<pid>/cwd
, o que funciona como/proc/<pid>/fd/<number>
. EstáCWD
na saída delsof
.cd - && cd -
nesse caso?O novo diretório A não é o mesmo que o diretório A. Ele pode ser verificado com o
stat
comando antes de excluir o antigo e depois de criar um novo, e você verá diferentes números de nós-i.E eu acho que isso está relacionado a como o kernel funciona. Ele simplesmente controla o número i do diretório atual para cada processo. Portanto, como existem números i diferentes, isso levará a diferentes colisões.
fonte
Esse é o comportamento esperado. O novo diretório A não é o mesmo que o diretório antigo A, apenas tem o mesmo nome. Portanto, o $ PWD do primeiro terminal ainda se foi, ele não reapareceu magicamente quando você o fez
mkdir A
.fonte
Um diretório, como um arquivo, possui um inode associado a ele:
307% mkdir ABC
308% ls -i 11997708 A 11997709 B 11997710 C
Um inode é uma estrutura de dados que contém informações sobre o diretório ou arquivo. Cada diretório e arquivo tem um. Pense nisso como um endereço (realmente um número de índice).
Se eu estiver em A, número do inode 11997708 e em outro shell (ou no mesmo shell que eu vou fazer), exclua o diretório A, recrie-o e ls o inode:
309% cd A
310% rmdir ../A
311% mkdir ../A
312% ls -i ..
11997720 A 11997709 B 11997710 C
O nó i é diferente, portanto, se ele tentar criar um arquivo no diretório excluído A:
313% tocam nisso
touch: não é possível tocar em 'this': esse arquivo ou diretório não existe
porque o diretório em que estou - não está mais associado ao inode 11997720 - portanto, onde atualmente não estou mais possui um endereço / índice legítimo. Assim, o erro.
fonte