디렉토리는 어떻게“특수 파일 형식”입니까?


답변:


19

* nix 스타일 (및 기타) 운영 체제의 많은 엔티티는 파일 시스템에 저장된 일련의 바이트 일 필요는 없지만 파일로 간주되거나 정의 된 파일과 유사한 측면을 갖습니다. 디렉토리가 어떻게 구현되는지는 파일 시스템의 종류에 따라 다르지만 일반적으로 목록으로 간주되는 디렉토리는 저장된 바이트 시퀀스이므로 특별한 의미가 없습니다.

* nix 컨텍스트에서 "파일"이 무엇인지 정의하는 한 가지 방법은 파일 설명자 와 연관된 파일 디스크립터 라는 것입니다. Wikipedia 기사에 따르면 파일 설명자

파이프 또는 네트워크 연결과 같은 파일 또는 기타 입력 / 출력 리소스 에 액세스하는 데 사용되는 추상 표시기입니다 .

즉, 시퀀스의 소스 / 대상이 지정되지 않았더라도 바이트 시퀀스를 읽거나 쓸 수있는 다양한 종류의 리소스를 나타냅니다. 다시 말해, 자원의 "어디"는 무엇이든 될 수 있습니다. 그것을 정의하는 것은 그것이 정보의 도관이라는 것입니다. 이것은 때때로 유닉스에서 "모든 것이 파일"이라고 말하는 이유의 일부입니다. 문자 그대로 완전히 받아 들여서는 안되지만 진지하게 고려해야 할 가치가 있습니다. 디렉토리의 경우,이 정보는 디렉토리의 내용 및 구현 수준이 낮은 파일 시스템 내에서 디렉토리를 찾는 방법과 관련이 있습니다.

네이티브 C 코드에서는 파일 디스크립터와 표면적으로 연결되어 있지 않기 때문에 디렉토리는 이런 의미에서 특별합니다. POSIX API는 특별한 유형의 스트림 핸들을 사용 DIR*합니다. 그러나이 유형에는 실제로 검색 할 수 있는 기본 설명자가 있습니다 . 디스크립터는 커널에 의해 관리되며 이들에 액세스하려면 항상 시스템 호출이 필요하므로 디스크립터의 또 다른 측면은 OS 커널에 의해 제어되는 도관이라는 것입니다. 이들은 0으로 시작하는 고유 한 (프로세스 당) 숫자를 갖습니다. 이는 일반적으로 표준 입력 스트림 의 설명자입니다 .


2
POSIX.1-2008은 시스템 호출 (한 무리의 추가 openat, fstatat등) 디렉토리를 참조 파일 디스크립터를 사용하는을.
zwol

2
더 흥미롭게도, fsync()읽기 전용 (!) 디렉토리 fd를 사용할 수 있으며 잘 정의 된 효과가 있습니다 (특히, 지정된 디렉토리의 파일 작성 / 이름 바꾸기 / 삭제를 "쓰기의 이론적으로 필요한 단계"로 디스크에 동기화 함) 임시 파일로 바꾸고 원래의 관용구 이름을 바꿉니다).
케빈

13

유닉스 일을하는 방식 : 모든 것이 파일입니다.

디렉토리는 하나의 (많은) 유형의 특수 파일입니다. 데이터가 포함되어 있지 않습니다. 대신 디렉토리 내에 포함 된 모든 파일에 대한 포인터가 포함됩니다.

다른 유형의 특수 파일 :

  • 모래밭
  • 소켓
  • 장치

그러나 "파일"로 간주되기 때문에 파일 ls이름을 바꾸고 이름을 바꾸고 이동할 수 있으며 특수 파일 유형에 따라 데이터를주고받을 수 있습니다.


1
그리고 이것은 디렉토리이기 때문에 다른 것을 할 필요가 없기 때문에 인생을 훨씬 쉽게 만듭니다. 이것은 명령 행 (또는 GUI)에서의 조작뿐만 아니라 프로그램 작성에도 적용됩니다.
gbarry

1
디렉토리에는 데이터 (디렉토리에 포함 된 파일을 설명하는 데이터)가 포함됩니다. 디렉토리에 액세스하고 (표준 오픈 콜이 아니더라도) 직접 데이터를 읽을 수 있지만 형식을 알지 못하면 브루스 에디 거 (Bruce Ediger)가 데이터를 많이 사용하지는 않습니다.
jamesqf

11

내 대답은 단순한 회상이지만 199x 빈티지 유닉스에서 많은 디렉토리가 파일이었으며 디스크상의 inode의 어딘가에 "디렉토리"로 표시되었습니다.

비슷한 디렉토리를 열고 open(".", O_RDONLY)사용 가능한 파일 디스크립터를 다시 얻을 수 있습니다. /usr/include올바른 C 구조체 정의를 찾아 내면 내용을 구문 분석 할 수 있습니다. 필자는 SunOS 4.1.x 시스템, SGI의 EFS 파일 시스템 및 파일 시스템에 대한 DEC의 Mips-CPU 워크 스테이션 (BSD4.2 FFS)에 대해이 작업을 수행했음을 알고 있습니다.

그것은 나쁜 경험이었습니다. 디렉토리가 더 이상 엄격한 파일이 아니더라도 가상 파일 시스템 계층에서 표준화하는 것은 이식성을 위해 좋은 것입니다. VFS 계층을 사용하면 ReiserFS 또는 NFS와 같이 디렉토리가 파일이 아닌 파일 시스템을 실험 할 수 있습니다.



1
오늘날에도 여전히 일부 유닉스 변종에서 디렉토리를 열고 파일로 읽을 수 있습니다. 예를 들어 FreeBSD 10.1에서도 여전히 가능합니다. (실제로 할 수 있음)
Gilles 'SO- 악의를 멈춰라'

@Gilles cp --link dir1/* dir2비록 dd에 의해 복사 된 디렉토리가 본질적으로에 해당한다면 그것의 유용성은 확실하지 않지만 매우 논리적이라고 생각합니다 .
peterh는 모니카 복원

3

디렉토리는 모드에 'd'가 있다는 점에서 특별합니다. 파일 시스템은 그 내용을 바이트 시퀀스 인 일반 파일이 아니라 디렉토리에 포함 된 다른 파일 목록으로 해석해야한다고 알려줍니다. 응용 프로그램에서 읽습니다. 그게 다야


Apple의 HFS +에는 모든 경로 이름을 포함하는 하나의 큰 B + 트리가 있습니다. 그러나 내가 올바르게 기억한다면 유닉스 파일 시스템에서 BSD의 ffs까지 포함됩니다. 아마도 인용 된 튜토리얼의 저자들이 생각했던 것입니다.
zwol

2

리눅스 시스템은 범용 i / o 모델을 사용하기 때문에 디렉토리는 파일이다 . 모델에서 시스템의 모든 것은 파일이며 동일한 시스템 호출 및 다양한 명령으로 액세스 할 수 있습니다.

i- 노드에는 파일 유형에 대한 표시가 있고 파일 이름 테이블과 다른 i- 노드에 대한 링크가되는 특수 구조를 갖기 때문에 특수한 유형입니다. 디렉토리의 i- 노드에서 "하드 링크"라고도하는 이러한 파일 이름 링크 쌍은 디렉토리의 "내부"파일을 열거합니다.

디렉토리는 파일을 구성하기위한 것입니다. 파일이 디렉토리에서 다른 디렉토리로 "이동"되면 파일 자체는 디스크에서 재배치되지 않습니다. 한 디렉토리 i- 노드의 항목이 제거되고 다른 디렉토리 i- 노드에 기록됩니다.


-3

허용 된 답변이 완전히 맞지 않습니다. POSIX 시스템에서 "노드"는 파일 및 디렉토리를 가리 킵니다. 파일 디스크립터는 시스템 전체가 아닌 프로세스에만 고유합니다. 그러나 하나 이상의 inode가 단일 파일을 가리킬 수 있지만 inode는 고유합니다. 허용 된 답변에 대해 의견을 말했지만 담당자 제한으로 인한 것은 아닙니다.


2
아니요, 하나의 inode 만 동일한 파일을 가리킬 수 있습니다. 동일한 inode가 여러 디렉토리 (또는 여러 이름)에 동시에 존재할 수 있습니다. 쉬운 점검 : ls -l >test.txt;ln -vf test.txt test2.txt;ls -li test.txt test2.txt. 따라서 하드 링크는 동일한 inode 번호를가집니다.
peterh는 모니카 복원

@peterh 파일 디스크립터는 프로세스에만 고유합니다. 설명 할 수 있습니까?
alamin

1
@ Md.AlaminMahamud 프로세스가 fork()s 인 경우 자식 프로세스가 O_CLOEXEC원래 프로세스와 정확히 같은 파일 설명자 엔터티를 가질 것입니다 (특별한 상황, 즉 플래그 제외 ). 또 다른 예 : 아파치 자식 프로세스는 listen()동일한 소켓 파일 설명자에 있습니다. 그러나이 대답은 커널 내부 데이터 구조이며 커널 메모리에만 존재하는 파일 디스크립터에 관한 것이 아닙니다. 이 ( false ) 답변은 디렉토리 항목과 아이 노드에 관한 것으로 디스크상의 엔터티입니다 (즉, 하드 드라이브의 물리적 바이트 임).
peterh는 모니카 복원

1
@ Md.AlaminMahamud 글쎄, 이제는 확실하지 않습니다. 예를 들어 발생하는 경우 fork()자식 프로세스가 부모 프로세스 seek()close()파일 설명자에 영향을 미치지 않습니다. 따라서 파일 디스크립터는 부분적으로 프로세스 전용 구조라고 생각합니다. 그러나이 질문은 그들에 관한 것이 아니며,이 질문은 급류 / 아이디어에 관한 것이며이 질문에 대한 전적으로 잘못된 대답에 대해 당신을 논평하고 있습니다.
peterh는 모니카 복원
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.