Mam dwie otwarte muszle. Pierwszy znajduje się w katalogu A. W drugim usuwam katalog A, a następnie tworzę go ponownie. Kiedy wracam do pierwszej powłoki i piszę ls
, dane wyjściowe są następujące:
ls: cannot open directory .: Stale file handle
Dlaczego? Myślałem, że pierwsza powłoka (ta, która pozostała otwarta w nieistniejącym katalogu) „zawiesiłaby się” podczas oczekiwania na następne polecenie i nie „uświadomiłaby sobie”, że katalog został usunięty i ponownie utworzony. Czy powłoka zawiera „głębsze” odwołanie do bieżącego katalogu roboczego innego niż ciąg $PWD
?
bash
filesystems
open-files
pwd
fonini
źródło
źródło
cd $PWD
.Odpowiedzi:
Katalog (jak każdy plik) nie jest zdefiniowany przez swoją nazwę. Pomyśl o nazwie jak o adresie katalogu . Gdy przenosisz katalog, pozostaje to ten sam katalog, tak jak w przypadku przeprowadzki do innego domu, nadal jesteś tą samą osobą. Jeśli usuniesz katalog i utworzysz nowy o tej samej nazwie, będzie to nowy katalog, podobnie jak ktoś, kto wprowadza się do domu, w którym mieszkałeś, to nie ty.
Każdy proces ma katalog roboczy .
cd
Polecenie w powłoce zmienia aktualny katalog roboczy powłoki.pwd
Komenda drukuje the¹ ścieżkę do bieżącego katalogu roboczego.Po usunięciu katalogu A dokonano usunięcia wpisu A w katalogu nadrzędnym. Sam katalog A pozostał w systemie plików, ale w stanie odłączonym, bez nazwy. Nie został jeszcze usunięty, ponieważ był używany przez proces, a mianowicie pierwszą powłokę. Kiedy zmieniłeś katalog w pierwszej powłoce, katalog został ostatecznie usunięty. To samo dzieje się, gdy plik jest usuwany, gdy proces ma go jeszcze otwarty: pozycja katalogu pliku jest usuwana natychmiast, a sam plik jest usuwany, gdy przestaje być używany.
Podobnie obserwuj, co się dzieje, gdy przenosisz katalogi.
W innej powłoce:
W pierwszej powłoce:
Plik
1
znajduje się w katalogu, który był pierwotnie wywoływanyone
i teraz jest wywoływanytwo
. Plik2
znajduje się w katalogu, który był pierwotnie wywoływanytwo
i teraz jest wywoływanyone
.Đ Dokładniej drogę, która nie może być unikalny jeśli obejmuje linki lub innych symbolicznych subtelności.
źródło
/proc/<pid>/cwd
, co działa podobnie/proc/<pid>/fd/<number>
. JestCWD
w wynikulsof
.cd - && cd -
w takim przypadku można zrobić automatyczne ?Nowy katalog A nie jest taki sam jak katalog A. Można go sprawdzić
stat
poleceniem przed usunięciem starego i po utworzeniu nowego, a zobaczysz różne numery i-węzłów.Myślę, że jest to związane z działaniem jądra. Po prostu śledzi numer i bieżącego katalogu dla każdego procesu. Ponieważ istnieją różne liczby i, doprowadzi to do różnych kolizji.
źródło
Jest to oczekiwane zachowanie. Nowy katalog A nie jest taki sam jak stary katalog A, po prostu ma taką samą nazwę. Więc $ PWD z pierwszego terminala wciąż nie ma, nie pojawił się magicznie, kiedy to zrobiłeś
mkdir A
.źródło
Z katalogiem, takim jak plik, związana jest i-węzła:
307% mkdir ABC
308% ls -i 11997708 A 11997709 B 11997710 C.
I-węzeł to struktura danych, która zawiera informacje o katalogu lub pliku. Każdy katalog i plik ma jeden. Pomyśl o tym jak o adresie (naprawdę numer indeksu).
Jeśli jestem w A, i-węzeł o numerze 11997708 i w innej powłoce (lub w tej samej powłoce, co zamierzam zrobić), usuń katalog A, a następnie utwórz go ponownie i jest to i-węzeł:
309% cd A
310% rmdir ../A
311% mkdir ../A
312% ls -i ..
11997720 A 11997709 B 11997710 C.
Węzeł i jest inny, więc jeśli spróbuje utworzyć plik w usuniętym katalogu A:
313% dotknie tego
touch: nie można dotknąć „this”: brak takiego pliku lub katalogu
ponieważ katalog, w którym się znajduję - nie jest już powiązany z i-węzłem 11997720 - więc tam, gdzie obecnie nie ma już prawidłowego adresu / indeksu - i-węzeł. Zatem błąd.
źródło