파일의 파일 이름은 파일의 inode에 대한 포인터라고 합니다. 이것을 알기 전에는 이것이 작업을 수행한 파일의 경로 이름이라고 생각했습니다.
Unix에서 경로 이름과 파일 이름이 어떻게 정의되는지 잘 모르겠습니다. 예를 들어,
/home/tim/tim.pdf
파일 이름의 파일 경로 이름이 정확합니다 tim.pdf
.
파일 이름과 파일 경로 이름의 차이점이 무엇인지 알고 싶습니다. 감사해요.
답변1
디렉토리에는 파일 이름 ⇒ inode 매핑 목록이 포함되어 있습니다. 귀하의 디렉토리에는 (예를 들어) inode 를 가리키는 /home/tim
파일 이름이 있는 항목이 포함되어 있습니다 .tim.pdf
1234
이 디렉토리에 어떻게 가나요? 음, 디렉토리는 실제로 이러한 항목을 포함하는 특수 파일입니다. 상위 파일을 보면 다른 파일과 마찬가지로 찾을 수 있습니다. 디렉터리 inode를 가리키는 /home
파일 이름이 있는 항목이 있을 것입니다 . tim
차례로, 우리는 /home
그것의 부모를 살펴봄으로써 그것을 찾을 수 있습니다 /
.
/
뿌리인데 좀 특별하네요. 시스템은 부모가 없기 때문에 직접 액세스하는 방법을 알고 있습니다.
이것이름파일의 로컬 이름은 해당 디렉토리의 로컬 이름입니다: tim.pdf
.this길파일에 대한 설명은 루트 디렉터리에서 파일에 액세스하는 방법을 설명합니다. /home/tim/tim.pdf
원하는 경우 이를 일련의 지침으로 생각할 수 있습니다. 먼저 찾기 /
, home
그 안에서 찾기 tim
, 마지막으로 tim.pdf
원하는 항목을 찾으십시오.
모든 경로를 구문 분석하는 것은 실제로 다음 의사 코드를 사용하는 재귀 알고리즘입니다.
inode find_file(inode where_i_am, string[] remaining_path):
if remaining_path is empty:
# Nothing more to look at - we've found the file!
return where_i_am
current_item = remaining_path[0]
rest_of_path = remaining_path[1..]
for entry in directory_entries(where_i_am):
if entry.filename == current_item:
return find_file(entry.inode, rest_of_path)
return file not found
다음을 통해 귀하의 파일을 찾을 수 있습니다:
find_file(inode_of_root, ["home", "tim", "tim.pdf"])
어떤 경우에는 상황이 좀 더 복잡해지고 의사 코드는 이러한 경우를 다루지 않습니다. 그 중 하나는 마운트입니다. 다른 파티션을 마운트할 때 /home
시스템은 해당 파티션이 들어올 때 /home
다른 파티션으로 이동해야 한다는 것을 기억하고 tim
해당 파일 시스템의 루트에서 찾기 시작합니다. 새 파일 시스템에는 자체 inode 세트가 있으므로 실제로 파일 데이터에 액세스하려면 inode와 장치를 알아야 합니다. 실제 구조는 실제로 둘 다로 구성됩니다.
심볼릭 링크는 시스템에 지금 다른 경로를 찾은 다음 해당 새 위치에서 검색을 계속하도록 지시합니다.
또 다른 경우는 하드 링크(오래된 친구)입니다. 일반 파일 inode에는 원하는 수의 하드 링크가 있을 수 있습니다. ln tim.pdf pdf.tim
동일한 내용을 가지며 디스크의 동일한 위치에 있는 링크 설정을 사용할 수 있습니다 . pdf.tim
동일한 inode를 가리키는 항목이 있는 별도의 디렉토리 항목이 있습니다 . 우리의 알고리즘은 이 경우에 매우 잘 작동합니다. 파일에 대한 하드 링크는 원본 파일과 정확히 동일하며 어떤 식으로든 이를 구별할 필요가 전혀 없습니다. 실제로 하드 링크는 inode의 또 다른 이름일 뿐이므로 파일 시스템 전체에 하드 링크를 만들 수 없습니다.1234
tim.pdf
다른 하나는 특별 항목 .
과 ..
. 이는 (일반적으로 파일 시스템에 따라 다름) 실제 디렉토리 항목입니다. 이는 본질적으로 디렉토리 자체와 상위 디렉토리에 대한 하드 링크입니다. 우리의 알고리즘도 이 문제를 처리합니다. 마운트에 관해 흥미로운 점이 있습니다. 기본 파일 시스템은 마운트될 위치를 모르기 때문에 올바른 ..
항목을 가질 수 없습니다. 이 문제를 해결하기 위해 시스템은 ..
탑재된 파일 시스템의 루트 항목 대신 상위 장치의 디렉터리 항목을 속이고 표시합니다.
따라서 inode 관점에서 보면 다음과 같습니다.
- ㅏ파일 이름특정 디렉터리 내에서 호출되는 특정 인덱스 노드의 이름입니다.
- ㅏ길알려진 지점에서 인덱스 노드에 도달하는 방법에 대한 몇 가지 지침이 있습니다.
답변2
존재하다POSIX 용어,ㅏ파일 이름디렉토리 항목의 이름입니다. null 또는 null 을 제외하고 비어 있지 않은 바이트 시퀀스로 구성됩니다 /
. "경로 이름 구성 요소"라는 용어는 "파일 이름"과 동의어입니다. ㅏ경로명null이 아닌 바이트를 포함할 수 있고 파일을 찾는 방법을 지정하는 문자열입니다. 경로 이름은 일련의 파일 이름으로 구성되며, 마지막 이름을 제외한 모든 이름은 디렉터리를 나타냅니다.경로명 확인경로 이름에서 파일을 찾는 프로세스입니다.
예를 들어, /home/tim/tim.pdf
경로 이름입니다. 경로 이름의 마지막 구성 요소 tim.pdf
는 파일 이름입니다. 이는 경로 이름으로 명명된 디렉터리에 있는 항목의 이름입니다 /home/tim
. 파일 이름 tim
자체는 pathname이라는 디렉토리에 있는 항목의 이름입니다 /home
. 파일은 디렉토리입니다. tim.pdf
또한 경로 이름: 모든 파일 이름은 단일 구성 요소를 갖는 경로 이름이며 현재 디렉터리에 해당 이름을 가진 파일을 지정합니다.
/
루트 디렉터리의 경로 이름을 나타냅니다. .
모든 디렉터리에 존재하며 디렉터리 자체를 참조하는 파일 이름입니다. .
정확히 단일 구성 요소를 포함하고 현재 디렉터리를 참조하는 경로 이름입니다.
파일 이름은 해당 디렉토리에 있는 파일인 inode에 대한 디렉토리의 포인터로 생각할 수 있습니다. 경로 이름은 inode를 찾을 위치를 지정합니다. 경로 이름의 각 구성 요소는 지금까지 도달한 디렉터리(파일이 존재하는 경우)의 인덱스 노드를 가리키는 파일 이름입니다. 경로 이름은 루트 디렉토리에서 시작됩니다.절대 경로 이름, )로 시작하거나 /
현재 디렉토리에 있는 경우상대 경로 이름, )로 시작하지 않습니다 /
.
많은 텍스트에서 "파일 이름"(또는 "파일 이름")이라는 용어는 POSIX가 경로 이름이라고 부르는 것을 의미하는 데 사용됩니다.
답변3
일반적으로 말하자면, pathname
및 filenames
는 동일합니다. 먼저 filenames
POSIX 문서에서 몇 가지 규칙을 읽어보세요.
4.6 파일 이름
IEEE Std 1003.1-2001을 준수하는 구현 간에 파일 이름을 이식할 수 있으려면 이식 가능한 파일 이름 문자 집합에 정의된 이식 가능한 파일 이름 문자만 포함해야 합니다.
이식 가능한 파일 이름의 첫 번째 문자로 하이픈을 사용할 수 없습니다. 대문자와 소문자는 일관된 구현 간에 고유한 ID를 유지해야 합니다. 이식 가능한 경로 이름의 경우 슬래시 문자도 사용할 수 있습니다.
filename
이 섹션에서는 이 두 가지가 사용되고 상호 교환 가능 하다는 것을 알 수 있습니다 pathname
.
그들 사이에는 다음과 같은 차이점도 있습니다 Pathname Resolution
.
4.11 경로명 결정
파일 계층의 특정 파일에 대한 경로 이름을 확인하는 프로세스에 대해 경로 이름 확인이 수행됩니다. 동일한 파일을 확인하는 경로 이름이 여러 개 있을 수 있습니다.
경로 이름의 각 파일 이름은 이전 파일에서 지정한 디렉터리에 있습니다. 예를 들어 경로 이름 조각 a/b에서 파일 b는 디렉터리 a에 있습니다. 이를 수행할 수 없으면 경로 이름 확인이 실패합니다. 경로명이 슬래시로 시작하는 경우, 경로명의 첫 번째 파일명의 선행자는 프로세스의 루트 디렉토리로 취급됩니다(이러한 경로명은 "절대 경로명"입니다). 경로 이름이 슬래시로 시작하지 않으면 경로 이름의 첫 번째 파일 이름 선행자는 프로세스의 현재 작업 디렉터리로 처리됩니다(이러한 경로 이름은 "상대 경로 이름"입니다).
pathname
이전 파일이 지정한 디렉토리에 이름이 있는 파일로 해석됩니다.
노트