하드 링크 수가 0이되면 디렉토리가 제거됩니까? 하드 링크

하드 링크 수가 0이되면 디렉토리가 제거됩니까?

디렉토리는로 인해 하드 링크 수로 항상 2 이상을가집니다 .. rm -r디렉토리 일 때 하드 링크 수가 1 대신 2에서 0으로 줄어 듭니까?

디렉토리의 하드 링크 수는 1이 될 수 있습니까?

감사.



답변

첫째로 모든 파일 시스템 사용 ...하드 링크로. 이것은 gnu find 매뉴얼에 설명되어 있습니다. 나는 유닉스 용으로 설계되지 않았고 명확성을 추가하지 않고 사물을 복잡하게 만들었 기 때문에 나머지 대답에 대해서는 그 파일 시스템을 무시할 것입니다. 또한 같은 이유로 루트 디렉토리와 마운트 지점을 무시할 것입니다.

.및로 인해 디렉토리에 대한 링크 수는 두 개 이상 ..입니다. 서브 디렉토리의 수는 링크 수에서 2를 뺀 것과 같습니다. 이로 인해 디렉토리를 링크하거나 링크를 해제 할 수 없으므로 디렉토리 대신 삭제 및 사용하기 전에 파일도 마찬가지 rm -r입니다 . 두 시스템 호출은 커널에서 완전히 다른 코드 경로를 사용합니다.statrmdirunlink


답변

참조 횟수 (예 : 하드 링크 수 열린 파일 핸들 수의 합계 )가 0에 도달 하는 기존에 디자인 된 UNIX 파일 시스템의 모든 파일 이 제거됩니다. 그러나 현대 UNIX 시스템의 경우, rmdir시스템 콜은 오히려 제거보다 한 번의 작업으로 빈 디렉토리를 제거 .하고 ..하나씩.

그러나 역사적 UNIX 시스템에서는이 시스템 호출이 존재하지 않았습니다. 대신, rmdir 명령 (A의 setuid 프로그램이었다 소스 코드는 여기에서 찾을 수 있습니다 ) 디렉토리가 (특별 항목 제외) 비어 있음을 확인하는 다음 제거 ..하고 ., 순서대로 다음 디렉토리 자체는 모든 제거 unlink디렉토리에서 루트 만 사용할 수있는 시스템 호출 (따라서 명령이 setuid 인 이유). 따라서 해당 시스템에서 디렉토리의 링크 수는 잠시 후 1 .이되고 상위 디렉토리에서 디렉토리가 제거되기 전에는 1 이됩니다.

rm명령으로 인해 루트에서도 디렉토리를 제거하지 못했습니다. 그리고 내용을 비운 후 디렉토리를 제거하라는 명령을 rm -r호출합니다 rmdir.

이러한 역사적 체제에서, 오용 unlink프로그램에서 호출, 루트로 실행하는 경쟁 조건으로 실행 rmdir하거나 mv, 또는 현재 디렉토리 (현대 시스템은이를 방지) 삭제 된 과정에서 파일을 생성하면, 파일이나 디렉토리 매달려 될 수 있습니다 하드 링크 수는 0보다 크지 만 디렉토리 트리에는 없습니다. 이 조건은에 의해 감지되었으며 대부분의 파일 시스템에서 물리적으로 가능하기 때문에 여전히 dcheck확인 중 하나입니다 fsck.


우발적으로 파일 시스템은 하드 링크가있는 일반 파일로 디렉토리 ( .및 포함 ..) 를 구현할 필요가 없습니다 . 이러한 파일 시스템에서 디렉토리의 하드 링크 수는 항상 다음과 같이보고됩니다 0(물론 상위 디렉토리 내에 존재하는 경우 “참조 수”는 1입니다).


제거 된 디렉토리의 동작 (예 : 이미 열려 있거나 현재 디렉토리로 가지고있는 프로세스에 의해 검사 될 때) 및 디렉토리의 “링크 수”의 정확한 의미는 지정되지 않습니다. 예를 들어, Mac OS X에서는 실제 하드 링크가 없어도 하드 링크 수는 2 로보고됩니다. 비록 ...목록에 표시되지 않습니다, 디렉토리를 열 수 및 stat이름으로 호출 할 수 있습니다 .또는 ... Linux의 경우, 링크 수는 있지만, 0 ...마찬가지로 여전히 작동합니다.

Mac OS X은 또한 디렉토리 의 모든 파일 수를 하위 디렉토리 수 대신 링크 수로 보고합니다 . 그러나이 경우에도 2 ...사라.


* 여기에는 일반적인 열린 설명자, 메모리 매핑 된 섹션 (예 : 바이너리 및 공유 라이브러리 실행 포함) 및 현재 디렉토리 처리가 포함됩니다.