![디렉토리에 대한 하드 링크 수가 0이 되면 디렉토리가 삭제됩니까?](https://linux55.com/image/64558/%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC%EC%97%90%20%EB%8C%80%ED%95%9C%20%ED%95%98%EB%93%9C%20%EB%A7%81%ED%81%AC%20%EC%88%98%EA%B0%80%200%EC%9D%B4%20%EB%90%98%EB%A9%B4%20%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC%EA%B0%80%20%EC%82%AD%EC%A0%9C%EB%90%A9%EB%8B%88%EA%B9%8C%3F.png)
디렉토리에 대한 하드 링크 수가 0이 되면 디렉토리가 삭제됩니까?
디렉토리에는 항상 최소 2개의 하드 링크가 있습니다 .
. rm -r
디렉토리인 경우 하드 링크 수를 1이 아닌 2에서 0으로 줄입니까?
디렉토리의 하드 링크 수는 1이 될 수 있습니까?
감사해요.
답변1
전통적으로 설계된 UNIX 파일 시스템의 모든 파일참조 카운팅(예: 하드 링크 수의 합계그리고열린 파일 핸들은 숫자 *)가 0에 도달하면 삭제됩니다. 그러나 최신 UNIX 시스템에서 rmdir
시스템 호출은 하나씩이 아닌 단일 작업으로 빈 디렉터리를 삭제합니다 .
...
그러나 과거 UNIX 시스템에서는 이 시스템 호출이 존재하지 않았습니다. 반대로,rmdir
주문하다setuid 프로그램입니다(소스 코드는 여기에서 찾을 수 있습니다...
), 디렉토리가 비어 있는지 확인하고(특수 항목 제외) 및 를 순서대로 삭제 .
한 다음 디렉토리 자체를 삭제합니다. 모두 unlink
디렉토리에 루트만 허용된다는 시스템 호출을 사용합니다(따라서 명령이 setuid인 이유). . 따라서 이러한 시스템에서는 디렉토리의 링크 수가 .
삭제된 후 임시로 1이 되지만 상위 디렉토리에서 디렉토리가 삭제될 때까지는 0이 됩니다.
그런데 이 rm
명령은 루트가 디렉터리를 삭제하는 것도 방지합니다. 그리고 디렉토리 내용을 지운 후 rm -r
디렉토리를 삭제하는 명령을 호출 합니다.rmdir
unlink
이러한 기록 시스템에서는 루트로 실행 중인 프로그램에 대한 호출을 잘못 사용하거나 rmdir
또는 과의 경쟁 조건이 발생 mv
하거나 현재 디렉터리가 삭제된 프로세스에서 파일을 생성하면 정지가 발생할 수 있습니다 (최신 시스템에서는 이를 방지함). 디렉토리의 하드 링크 수가 0보다 크지만 디렉토리 트리에는 존재하지 않습니다. 이 상황은 대부분의 파일 시스템에서 물리적으로 여전히 가능하므로 에 의해 감지 dcheck
되고 검사 중 하나로 남아 있습니다 .fsck
그런데 파일 시스템은 하드 링크가 있는 일반 파일로 디렉토리( .
및 포함)를 구현할 필요가 없습니다 . ..
이러한 파일 시스템에서 디렉토리의 하드 링크 수는 항상 다음과 같이 보고됩니다 0
(물론 상위 디렉토리에 존재하는 경우 "참조 수" 1과 일치함).
삭제된 디렉터리의 동작(예: 해당 디렉터리를 열거나 현재 디렉터리로 사용하는 프로세스에서 검사할 때)과 디렉터리의 "링크 수"의 정확한 의미는 지정되지 않습니다. 예를 들어, Mac OS X에서는하드 링크 수를 2로 보고, 실제 하드 링크가 없더라도 마찬가지입니다. 목록에 .
및 이 나타나지 않더라도 디렉토리를 열 수 있고 또는 이름을 사용하여 호출 할 수 있습니다 . Linux에서는 링크 수가 0이지만 여전히 작동합니다...
stat
.
..
.
..
Mac OS X도 보고합니다.모든 파일하위 디렉터리 수뿐만 아니라 디렉터리의 링크 수입니다. 하지만 언제 .
그리고 ..
사라져도 그것은 여전히 2입니다.
*여기에는 일반 개방형 설명자, 메모리 맵의 일부(예: 실행 가능한 바이너리 및 공유 라이브러리 포함) 및 프로세스 현재 디렉터리가 포함됩니다.
답변2
첫째, 모든 파일 시스템이 .
및를 ..
하드 링크로 사용하는 것은 아닙니다. 이는 gnu find 매뉴얼에 문서화되어 있습니다. 나머지 답변에서는 이러한 파일 시스템을 무시하겠습니다. 왜냐하면 유닉스용으로 설계되지 않았고 명확성을 추가하지 않고 작업을 복잡하게 만들기 때문입니다. 같은 이유로 루트 디렉터리와 마운트 지점도 무시하겠습니다.
.
및 때문에 디렉토리에 대한 링크 수는 2개보다 작을 수 없습니다 ..
. 하위 디렉터리 수는 링크 수에서 2를 뺀 것과 같습니다. 따라서 디렉터리를 연결하거나 연결 해제할 수 없으며 디렉터리 이전의 파일을 삭제하고 사용할 수도 없습니다 rm -r
. 이 두 시스템 호출은 커널에서 완전히 다른 코드 경로를 사용합니다.stat
rmdir
unlink