답변:
첫째로 모든 파일 시스템 사용 .
및 ..
하드 링크로. 이것은 gnu find 매뉴얼에 설명되어 있습니다. 나는 유닉스 용으로 설계되지 않았고 명확성을 추가하지 않고 사물을 복잡하게 만들었 기 때문에 나머지 대답에 대해서는 그 파일 시스템을 무시할 것입니다. 또한 같은 이유로 루트 디렉토리와 마운트 지점을 무시할 것입니다.
.
및로 인해 디렉토리에 대한 링크 수는 두 개 이상 ..
입니다. 서브 디렉토리의 수는 링크 수에서 2를 뺀 것과 같습니다. 이로 인해 디렉토리를 링크하거나 링크를 해제 할 수 없으므로 디렉토리 대신 삭제 및 사용하기 전에 파일도 마찬가지 rm -r
입니다 . 두 시스템 호출은 커널에서 완전히 다른 코드 경로를 사용합니다.stat
rmdir
unlink
..
각 디렉토리에 존재 입니다 하위 디렉토리. 인을 제외한 모든 /
너무 한 모든 디렉토리 있도록이있는.
..
자체 하드 링크 가 없습니다. 디렉토리에 대한 하드 링크는 무엇입니까? 경로명을 가진 파일, .
? (2) 왜 마운트 지점을 무시합니까?
..
은 부모를 가리 킵니다. 특별한 경우 루트 디렉토리 링크는 자신을 가리 킵니다. 이렇게하면 cd ..\..
어디에서나 비슷한 명령을 예상대로 작동 할 수 있습니다. stat
명령으로 테스트 할 수 있습니다 .
..
. .
부모 디렉토리의 이름과이를 가리키는 이름 때문입니다 . 부모가없는 루트는 예외입니다. 그러나 그것은 ..
스스로 를 가리키고 있기 때문에, 또한 링크 수는 2입니다.
참조 횟수 (예 : 하드 링크 수 와 열린 파일 핸들 수의 합계 )가 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 .
와 ..
사라.
* 여기에는 일반적인 열린 설명자, 메모리 매핑 된 섹션 (예 : 바이너리 및 공유 라이브러리 실행 포함) 및 현재 디렉토리 처리가 포함됩니다.
strcpy
setuid 실행 파일의 고정 크기 배열에 ... 이것은 좋은 시간이었습니다!
mkdir
동일한 작업을 반대로 수행해야한다는 사실 을 기반으로하여 게시 된 익스플로잇이 있습니다.
rmdir
다면 ..
부모 디렉토리를 제거 하지 않습니까 ?
..
하위 디렉토리가있는 경우에만 디렉토리에 하드 링크 가 있습니다. 맞습니까? 그래서..
오른쪽 디렉토리 항상 존재하지?