디렉터리 삭제 시 "ls" 오류 발생

디렉터리 삭제 시 "ls" 오류 발생

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

ls: cannot open directory .: Stale file handle

왜? 나는 첫 번째 쉘(존재하지 않는 디렉토리에 열려 있는 쉘)이 다음 명령을 기다리는 동안 "정지"되고 디렉토리가 삭제되고 다시 생성되었음을 "인식"하지 못한다고 생각합니다. 쉘에는 문자열 외에 현재 작업 디렉토리에 대한 "더 깊은" 참조가 있습니까 $PWD?

답변1

다른 파일과 마찬가지로 디렉터리는 이름으로 정의되지 않습니다. 이름을 디렉터리 이름으로 취급주소. 디렉터리를 이동해도 여전히 동일한 디렉터리입니다. 마치 다른 집으로 이동해도 여전히 같은 사람인 것과 같습니다. 디렉토리를 삭제하고 같은 이름으로 새 디렉토리를 생성하면 이전에 살았던 집에 이사 온 사람이 당신이 아니었던 것처럼 새로운 디렉토리가 됩니다.

모든 프로세스에는작업 목록. 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디렉토리 에 있습니다 .two2twoone

정확하게,경로는 심볼릭 링크나 기타 미묘한 부분이 포함된 경우 고유하지 않을 수 있습니다.

답변2

새 디렉토리 A는 디렉토리 A와 다릅니다. stat이전 디렉토리를 삭제하기 전과 새 디렉토리를 생성한 후에는 명령을 사용하여 이를 볼 수 있습니다.
나는 이것이 커널이 작동하는 방식과 관련이 있다고 생각합니다. 이는 단순히 각 프로세스의 현재 디렉터리의 i 번호를 추적합니다. 따라서 다른 i 번호로 인해 다른 충돌이 발생합니다.

답변3

이는 예상된 동작입니다. 새 디렉터리 A는 동일한 이름을 제외하고 이전 디렉터리 A와 다릅니다. 따라서 첫 번째 터미널의 $PWD는 실행 시에도 여전히 사라집니다 mkdir A.

답변4

파일과 같은 디렉터리에는 연결된 inode가 있습니다.

307% mkdirABC

308%ls-i 11997708A 11997709 B 11997710 C

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

내가 A에 있다면, 아이노드 번호11997708그리고 다른 쉘(또는 내가 하고 있는 것과 동일한 쉘)에서 디렉토리 A를 삭제한 다음 다시 생성하고 inode를 ls합니다.

309% CDA

310% rmdir ../A

311% mkdir ../A

312% ls -i ..

11997720A 11997709 B 11997710 C

i-노드가 다르기 때문에 삭제된 디렉터리 A에 파일을 생성하려고 하면 다음과 같습니다.

313%가 이에 노출되었습니다.

터치: '이것'을 터치할 수 없습니다: 해당 파일이나 디렉터리가 없습니다

내가 있는 디렉토리가 더 이상 inode와 연결되어 있지 않기 때문에11997720 - 그래서 지금 있는 곳에서는 더 이상 유효한 주소/인덱스가 없습니다. 따라서 오류가 발생했습니다.

관련 정보