디렉토리 삭제시`ls` 오류 입력 ls하면 출력은 다음과

두 개의 껍질이 열려 있습니다. 첫 번째는 디렉토리 A에 있습니다. 두 번째는 디렉토리 A를 제거한 다음 다시 만듭니다. 첫 번째 쉘로 돌아가서을 입력 ls하면 출력은 다음과 같습니다.

ls: cannot open directory .: Stale file handle

왜? 첫 번째 쉘 (존재하지 않는 디렉토리 안에 열려있는 쉘)은 다음 명령을 기다리는 동안 “고정”되고 디렉토리가 삭제되고 재 작성되었다는 것을 “실현”하지 않았다고 생각했습니다. 쉘이 문자열 이외의 현재 작업 디렉토리에 대한 “더 깊은”참조를 보유하고 $PWD있습니까?



답변

디렉토리 (예 : 모든 파일)는 이름으로 정의되지 않습니다. 이름을 디렉토리의 주소 로 생각하십시오 . 디렉토리를 옮길 때 여전히 같은 디렉토리입니다. 다른 집으로 이사하는 경우에도 여전히 같은 사람입니다. 디렉토리를 제거하고 같은 이름으로 새 디렉토리를 만들면 이전에 살던 집으로 이사하는 사람이 아닌 것처럼 새 디렉토리입니다.

각 프로세스에는 작업 디렉토리가 있습니다. cd쉘 의 명령은 쉘의 현재 작업 디렉토리를 변경합니다. 이 pwd명령은 현재 작업 디렉토리의 ¹ 경로를 인쇄합니다.

디렉토리 A를 제거했을 때, 이것은 부모 디렉토리에서 A에 대한 항목을 제거하는 것이 었습니다. 디렉토리 A 자체는 파일 시스템에 남아 있지만 이름이없는 분리 된 상태입니다. 프로세스, 즉 첫 번째 쉘에서 사용 중이므로 아직 삭제되지 않았습니다. 첫 번째 쉘에서 디렉토리를 변경하면 디렉토리가 마지막으로 삭제되었습니다. 프로세스가 여전히 열려있는 동안 파일이 삭제 될 때도 같은 일이 발생합니다. 파일의 디렉토리 항목이 즉시 제거되고 파일 자체는 사용이 중지되면 제거됩니다.

마찬가지로 디렉토리를 이동할 때 어떤 일이 발생하는지 관찰하십시오.

mkdir one two
touch one/1 two/2
cd one
ls

다른 껍질에서 :

mv one tmp
mv two one
mv tmp two

첫 번째 쉘에서 :

ls

파일 1은 원래 호출 된 디렉토리에 one있으며 이제는이라고 two합니다. 파일 2은 원래 호출 된 디렉토리에 two있으며 이제는이라고 one합니다.

¹ 좀 더 정확하게 말하면, 심볼릭 링크 나 다른 미묘한 부분이 포함 경로는 고유하지 않을 수 있습니다.


답변

새 디렉토리 A는 디렉토리 A와 동일하지 않습니다. 새 디렉토리 A stat를 삭제하기 전과 새 디렉토리 를 작성한 후 명령 으로 확인할 수 있으며 다른 i- 노드 번호가 표시됩니다.
그리고 이것은 커널 작동 방식과 관련이 있다고 생각합니다. 단순히 각 프로세스에 대한 현재 디렉토리의 i 번호를 추적합니다. 따라서 다른 i- 번호가 있으므로 다른 충돌이 발생합니다.


답변

이것은 예상 된 동작입니다. 새 디렉토리 A는 이전 디렉토리 A와 동일하지 않으며 동일한 이름을 갖습니다. 따라서 첫 번째 터미널의 $ PWD는 여전히 사라졌습니다 mkdir A.


답변

파일과 같은 디렉토리에는 관련된 inode가 있습니다.

307 % mkdir ABC

308 % ls -i
11997708 A 11997709 B 11997710 C

inode는 디렉토리 또는 파일에 대한 정보를 포함하는 데이터 구조입니다. 모든 디렉토리와 파일에는 하나가 있습니다. 이를 주소 (실제로 색인 번호)로 생각하십시오.

내가 A, inode 번호 11997708 및 다른 쉘 (또는 똑같은 쉘)에 있으면 디렉토리 A를 삭제 한 다음 다시 작성하고 inode를 ls하십시오.

309 % cd A

310 % rmdir ../A

311 % mkdir ../A

312 % ls -i ..

11997720 A 11997709 B 11997710 C

i 노드가 다르므로 삭제 된 디렉토리 A에 파일을 작성하려고하면 :

313 % 터치

touch : ‘this’를 터치 할 수 없습니다 : 해당 파일 또는 디렉토리가 없습니다.

내가있는 디렉토리가 더 이상 inode 11997720 과 연결되어 있지 않기 때문에 현재 더 이상 합법적 인 주소 / 색인 -inode 가 없습니다. 따라서 오류입니다.


답변