(흠 : 다음은 이제 서사시입니다 ...)
유닉스의 디렉토리의 디자인은 (현학적 수있는,있다 된 파일 시스템 일반적으로 하지만 반드시 유닉스의 OS에 연결)이 실제로 필요한 특별한 경우의 수를 감소 멋진 통찰력을 나타냅니다.
'디렉토리'는 실제로 파일 시스템의 파일입니다. 파일 시스템에있는 파일의 모든 실제 내용은 inode입니다 (질문에서, 당신은 이미이 것들 중 일부를 알고 있음을 알 수 있습니다). 디스크의 inode에는 구조가 없습니다. 디스크에 땅콩 버터처럼 퍼져있는 많은 수의 바이트 블록입니다. 이것은 유용하지 않으며, 단정 한 마음을 가진 사람이라면 누구나 기피 할 수 있습니다.
유일한 특별한 아이 노드는 (전통의 이유로하지 0 또는 1) 아이 노드 수를 2; inode 2는 디렉토리 파일 인 루트 디렉토리 입니다. 시스템이 파일 시스템을 마운트하면 시작하기 위해 indir 2를 읽어야한다는 것을 '알고'있습니다.
디렉토리 파일은 opendir (3)과 친구들에 의해 읽히기위한 내부 구조를 가진 파일 일뿐입니다. 내부 구조는 dir (5)에 기록되어 있습니다 (OS에 따라 다름). 이를 보면 디렉토리 파일 항목에 파일에 대한 정보가 거의 포함되어 있지 않다는 것을 알 수 있습니다. 이 파일에서 특별한 몇 가지 사항 중 하나는 쓰기를 허용하는 모드로 디렉토리 파일을 열려고하면 open (2) 함수에 오류가 발생한다는 것입니다. 여러 가지 다른 명령 (하나의 예를 선택하기 위해 hexdump
)은 디렉토리 파일에서 정상적인 방식으로 작동하지 않을 것입니다. 왜냐하면 그것은 아마도 원하는 것이 아니기 때문입니다 (그러나 파일 시스템이 아닌 특수한 경우입니다).
하드 링크는 디렉토리 파일의 맵의 항목보다 아무것도 더도 적습니다. 같은 맵에 두 개의 (또는 그 이상) 항목을 가질 수 있으며, 둘 다 동일한 inode 번호로 매핑됩니다. 따라서이 inode에는 두 개 이상의 하드 링크가 있습니다. 또한 모든 파일에 하나 이상의 '하드 링크'가있는 이유도 설명합니다 . inode는 참조 횟수를 가지며, 파일 시스템 어딘가의 디렉토리 파일에 inode가 몇 번 언급되었는지 기록합니다 (이것은 사용자가 볼 때 표시되는 숫자입니다 ls -l
).
OK : 우리는 지금 요점에 도달하고 있습니다.
디렉토리 파일은 문자열 ( 'filenames')을 숫자 (inode number)로 매핑 한 것입니다. 이러한 inode 번호는 해당 디렉토리에있는 파일의 inode 번호입니다. 해당 디렉토리에 '있는'파일에는 다른 디렉토리 파일이 포함될 수 있으므로 해당 inode 번호는 디렉토리에 나열된 파일 중 하나입니다. 따라서 file이 있으면 /tmp/foo/bar
디렉토리 파일에 foo
해당 항목을 포함하고 bar
해당 문자열을 해당 파일의 inode에 매핑합니다. 디렉토리 파일의 항목도 있습니다 /tmp
디렉토리 파일, foo
디렉토리 '에'입니다 /tmp
.
mkdir (2)를 사용하여 디렉토리를 만들면 해당 함수
- 올바른 내부 구조로 디렉토리 파일 (일부 inode 번호)을 작성합니다.
- 새 디렉토리의 이름을이 새 inode (링크 중 하나를 설명)에 매핑하여 상위 디렉토리에 항목을 추가합니다.
- 문자열 '.'을 매핑하여 새 디렉토리에 항목을 추가합니다. 동일한 inode에 (이것은 다른 링크를 설명합니다)
- 새 디렉토리에 다른 항목을 추가하고 문자열 '..'을 2 단계에서 수정 한 디렉토리 파일의 inode에 매핑합니다 (하위 디렉토리를 포함하는 디렉토리 파일에서 볼 수있는 많은 수의 하드 링크를 설명 함) ).
최종 결과는 (거의) 유일한 특별한 경우입니다.
- open (2) 함수는 쓰기 위해 디렉토리 파일을 열지 못하게하여 발에 쏠 수 없도록합니다.
- mkdir (2) 함수는 새 디렉토리 파일에 몇 개의 추가 항목 ( '.'및 '..')을 추가하여 파일 시스템을 편리하게 이동할 수 있도록하여 편리하고 멋지게 만듭니다. 파일 시스템이 '.'없이 완벽하게 작동한다고 생각합니다. 그리고 '..'이지만 사용하기에는 고통 스러울 것입니다.
- 디렉토리 파일은 '특별한'것으로 표시되는 몇 가지 유형의 파일 중 하나입니다. 이것은 실제로 open (2)와 같이 약간 다르게 동작하도록 지시하는 것입니다.
st_mode
stat (2)를 참조하십시오 .
(스택 오버플로 원문 2011-10-20에서 복사 함)
..
의 나무 걷기 소프트웨어가 이미 "부모 디렉토리 링크에서주기를 따르지 말 것" 예외 를 가져야 할 필요가 있기 때문에,.
링크를 제외하고는 복잡성이 더해지지 않습니다 .