DIR(5)

명칭
dir, dirent - 디렉토리 파일 포맷

서식
<dirent.h>

해설
디렉토리는, 토대가 되는 기억 매체의 상세를 은폐 해, 파일을 그룹 나누고 하는 편리한 계층 수단을 제공합니다. 디렉토리 파일은, 그 inode(5) 엔트리중의 플래그에 의해, 통상 파일과 구별됩니다. 디렉토리 파일은 레코드 (디렉토리 엔트리)로부터 구성되어 각 레코드는 파일에 관한 정보와 그 파일 자신에게로의 포인터를 포함하고 있습니다. 디렉토리 엔트리는, 통상 파일과 같게, 다른 디렉토리를 포함하는 일도 있습니다. 그러한 상자가 된 디렉토리는 서브 디렉토리로 불립니다. 이와 같이 해 디렉토리와 파일의 계층 구조가 형성되어 이 구조는 파일 시스템으로 불립니다 (혹은 파일 시스템 트리 (으)로 불립니다).

각 디렉토리 파일에는 특별한 디렉토리 엔트리가 2 개 있습니다. 1 개(살)은 그 디렉토리 자신에게로의 포인터로, 닷 ‘.’ (으)로 불립니다. 이제(벌써) 1 개(살)은 자신의 친디렉토리에의 포인터로, 닷 닷 ‘..’ (으)로 불립니다. 닷과 닷 닷은 유효한 패스명입니다만, 시스템의 루트 디렉토리 ‘/’ 에는 친디렉토리가 없고, 닷 닷은 닷과 같이 자기 자신을 가리킵니다.

파일 시스템 노드는 보통 디렉토리 파일이며, 그 위에 물리 디스크나 그 디스크중의 분할된 area라고 했다 파일 시스템 오브젝트를 접합합니다 ( mount(2) 및 mount(8) 참조).

디렉토리 엔트리의 형식은 파일 <sys/dirent.h> 그리고 정의되고 있습니다 (이것은 직접 어플리케이션으로부터는 인클루드 되지 않습니다):

    #ifndef	_SYS_DIRENT_H_
    #define	_SYS_DIRENT_H_
    #include <machine/ansi.h>
    /*
     * dirent 구조체는, getdirentries(2) 시스템 콜로 돌려주어진다
     * 디렉토리 엔트리의 포맷을 정의합니다.
     *
     * 디렉토리 엔트리는 그 선두에 dirent 구조체를 가집니다. dirent
     * 구조체는 inode 번호, 그 엔트리의 길이, 그 엔트리에 포함된다
     * 이름의 길이를 보관 유지합니다. 그 후에, 널로 4 바이트 경계까지 패딩
     * 한 이름이 계속됩니다. 이름은 모두 널로 종단 하고 있는 것이 프로텍션됩니다.
     * 디렉토리안의 이름의 길이의 최대치는 MAXNAMLEN 입니다.
     */
    struct dirent {
    	__uint32_t d_fileno;		/* 엔트리의 파일 번호 */
    	__uint16_t d_reclen;		/* 이 레코드의 길이 */
    	__uint8_t  d_type; 		/* 파일 타입, 이하 참조 */
    	__uint8_t  d_namlen;		/* d_name 의 캐릭터 라인장 */
    #ifdef _POSIX_SOURCE
    	char	d_name[255 + 1];	/* 이름은 이 길이를 넘어서는 안 된다 */
    #else
    #define MAXNAMLEN       255
    	char    d_name[MAXNAMLEN + 1];  /* 이름은 이 길이를 넘어서는 안 된다 */
    #endif
    };
    /*
     * 파일 타입
     */
    #define	DT_UNKNOWN	 0
    #define	DT_FIFO		 1
    #define	DT_CHR		 2
    #define	DT_DIR		 4
    #define	DT_BLK		 6
    #define	DT_REG		 8
    #define	DT_LNK		10
    #define	DT_SOCK		12
    #define	DT_WHT		14
    /*
     * stat 구조 체형과 디렉토리형과의 변환
     */
    #define	IFTODT(mode)	(((mode) & 0170000) >> 12)
    #define	DTTOIF(dirtype)	((dirtype) << 12)
    /*
     * _GENERIC_DIRSIZ 매크로는 디렉토리 엔트리를 보관 유지하는 최소 레코드장을
     * 줍니다. 이것은 d_name 필드 이외의 dirent 구조체의 공간에, 널
     * 바이트로 종단 되는 이름을 위해서(때문에) 충분한 공간 (dp->d_namlen+1)을 더한 것
     * (을)를, 4 바이트 단위로 앞당긴 것입니다.
     */
    #define	_GENERIC_DIRSIZ(dp)     ((sizeof (struct dirent) - (MAXNAMLEN+1)) + (((dp)->d_namlen+1 + 3) &~ 3))
    #ifdef _KERNEL
    #define	GENERIC_DIRSIZ(dp)	_GENERIC_DIRSIZ(dp)
    #endif
    #endif /* ! _SYS_DIRENT_H_ */

관련 항목
fs(5), inode(5)

버그
struct dirent 의 멤버 d_type 는 FreeBSD 고유하고, 사용은 휴대용이 아닙니다. 또, 특정의 파일 시스템, 예를 들면 cd9660 파일 시스템에서는 실패합니다.

역사
파일 형식 dir 하 AT&T UNIX 그리고 등장했습니다.