내가 읽고 있어요이 유닉스 튜토리얼그리고 발견한 이 문장..
여기서 디렉토리는 단지 특별한 유형의 파일일 뿐이라는 점에 유의해야 합니다.
...하지만 설명이나 세부정보는 제공되지 않았습니다. 디렉토리가 실제로 파일인 이유는 무엇입니까?
답변1
*nix 스타일(및 기타) 운영 체제의 많은 엔터티는 파일로 처리되거나 파일과 유사한 측면을 정의했지만 파일 시스템에 저장된 바이트 시퀀스일 필요는 없습니다. 디렉토리가 구현되는 정확한 방법은 파일 시스템 유형에 따라 다르지만 일반적으로 디렉토리에 포함된 것(목록으로 처리됨)은 저장된 바이트의 시퀀스이므로 그런 의미에서는 그다지 특별하지 않습니다.
*nix 컨텍스트에서 "파일"을 정의하는 한 가지 방법은파일 설명자와 연관되다. Wikipedia 기사에 따르면 파일 설명자
파일 액세스에 대한 추상 표시기입니다.또는 기타 입력/출력 리소스, 파이프나 네트워크 연결 등...
즉, 해당 시퀀스의 소스/대상이 지정되지 않더라도 바이트 시퀀스를 읽고 쓸 수 있는 다양한 리소스를 나타냅니다. 즉, 리소스의 "위치"는 무엇이든 될 수 있습니다. 그 정의는 정보의 통로라는 것입니다. 이것이 때때로 UNIX에서 "모든 것이 파일이다"라고 말하는 이유 중 일부입니다. 이 말을 완전히 문자 그대로 받아들이면 안 되지만 진지하게 고려해 볼 가치가 있습니다. 디렉터리의 경우 이 정보는 디렉터리에 있는 내용과 더 낮은 구현 수준에서 파일 시스템에서 이를 찾는 방법과 관련됩니다.
디렉토리는 네이티브 C 코드에서 파일 설명자와 표면적으로 연관되어 있지 않다는 점에서 약간 특별합니다. POSIX API는 특수한 유형의 스트림 핸들을 사용 DIR*
하지만 이 유형에는 실제로 기본 설명자가 있습니다.검색 가능. 설명자는 커널에 의해 관리되며 이에 액세스하려면 항상 시스템 호출이 필요하므로 설명자의 또 다른 측면은 운영 체제 커널에 의해 제어되는 파이프라는 것입니다. 0으로 시작하는 고유한(프로세스별) 번호가 있으며 이는 일반적으로 프로세스에 대한 설명입니다. 표준 입력개울.
답변2
Unix 방식에서는 모든 것이 파일입니다.
디렉토리는 특별한 파일 유형입니다. 데이터가 없습니다. 대신 디렉터리에 포함된 모든 파일에 대한 포인터가 포함됩니다.
기타 유형의 특수 파일:
- 링크
- 소켓
- 장비
그러나 파일은 "파일"로 간주되므로 ls
이름을 바꾸고 이동할 수 있으며, 특정 파일 유형에 따라 데이터를 주고받을 수 있습니다.
답변3
내 대답은 단지 기억일 뿐이지만 199x의 이전 Unix에는 디스크 inode 어딘가에 "디렉터리"라는 레이블이 붙은 파일인 디렉터리가 많이 있었습니다.
비슷한 방법을 사용하여 디렉터리를 열고 open(".", O_RDONLY)
사용 가능한 파일 설명자를 얻을 수 있습니다. 주의 깊게 살펴보고 /usr/include
올바른 C 구조체 정의를 찾으면 내용을 구문 분석할 수 있습니다. 나는 SunOS 4.1.x 시스템, SGI의 EFS 파일 시스템 및 모든 DEC의 Mips-CPU 워크스테이션 파일 시스템(아마도 BSD4.2 FFS)에 대해 이 작업을 수행한다는 것을 알고 있습니다.
그것은 나쁜 경험이었습니다. 디렉터리가 더 이상 엄밀히 말하면 파일이 아니지만 가상 파일 시스템 계층의 표준화는 이식성에 좋습니다. VFS 계층을 사용하면 ReiserFS 또는 NFS와 같이 디렉터리가 파일이 아닌 파일 시스템을 실험할 수 있습니다.
답변4
Linux 시스템이 사용하기 때문에 디렉토리는 파일입니다.범용 입력/출력 모델. 이 모델에서는 시스템의 모든 것이 파일이며, 동일한 시스템 호출과 다양한 명령을 사용하여 액세스할 수 있습니다.
inode가 파일 유형으로 표시되어 있고 파일 이름 테이블과 다른 inode에 대한 링크로 구성된 특별한 구조를 갖고 있기 때문에 특별한 유형을 갖습니다. 이러한 파일 이름 링크 쌍("하드 링크"라고도 함)은 디렉터리의 inode에 있는 디렉터리 "내부" 파일을 열거합니다.
디렉터리는 파일을 정리하는 데에만 사용됩니다. 파일이 한 디렉터리에서 다른 디렉터리로 "이동"될 때 파일 자체는 디스크에 재배치되지 않습니다. 한 디렉토리 i-node의 항목을 삭제하고 다른 디렉토리 i-node에 쓰십시오.