UNIX 파일 디스크립터 (File Descriptor)
Jan 23, 2026 · Updated Jan 27, 2026
핵심 개념
섹션 제목: “핵심 개념”파일 디스크립터(File Descriptor)는 열린 파일을 참조하는 음이 아닌 정수로, 프로세스가 파일 I/O를 수행하는 핸들이다. read()/write() 시스템 콜 때마다 파일 경로를 전달하면 매번 경로 탐색이 필요하므로, 파일을 한 번 열면 이후에는 정수 인덱스로 빠르게 접근하는 추상화를 제공한다.
동작 원리
섹션 제목: “동작 원리”각 프로세스는 자신만의 파일 디스크립터 테이블을 가진다.
세 단계 테이블 구조
섹션 제목: “세 단계 테이블 구조”fd → file → inode 참조 체인
프로세스별 fd 테이블 fd → file 구조체 포인터
시스템 전역 file 테이블 파일 오프셋, 모드
in-core inode 테이블 아이노드 정보 + 참조 카운트
fork()시 자식은 부모의 fd 테이블을 복사하여 같은 file 구조체를 공유한다 (오프셋 공유)
fd 생명주기
섹션 제목: “fd 생명주기” 1 open()
경로명으로 파일을 열고 fd 반환 (0부터 시작하는 작은 정수) 2 read() / write()
fd를 사용해 현재 오프셋에서 I/O 수행, 오프셋 자동 갱신 3 close()
fd 해제, 참조 카운트 감소 표준 파일 디스크립터
섹션 제목: “표준 파일 디스크립터”| fd | 이름 | 용도 |
|---|---|---|
| 0 | stdin | 표준 입력 |
| 1 | stdout | 표준 출력 |
| 2 | stderr | 표준 에러 |
리다이렉션 ls > file은 stdout(fd 1)을 file로 교체한다.
파일 디스크립터는 “티켓 번호”와 같다. 식당(커널)에 줄 서서 번호표(fd)를 받으면, 이후 서비스(I/O)를 받을 때 번호만 부르면 된다.
- 작은 정수로 빠른 인덱싱
- 디바이스, 파이프, 소켓 등도 동일 인터페이스로 처리 (“모든 것이 파일”)
fork()시 자식에게 상속 → IPC 용이- 단점:
fork()후 부모-자식 간 오프셋 공유 (의도치 않은 동작 가능), 프로세스당 fd 개수 제한
관련 개념
섹션 제목: “관련 개념”- VFS (Virtual File System) - fd가 가리키는 file 객체를 관리하는 가상 파일 시스템 계층
- UNIX 아이노드 (Inode) - fd → file → inode 참조 체인의 최종 대상인 파일 메타데이터 구조
- 블로킹 vs 논블로킹 I/O - fd에 대해 블로킹 또는 논블로킹 모드를 설정하여 I/O 동작 방식을 결정
- UNIX 블록 버퍼 캐시 - fd를 통한 read()/write()가 경유하는 커널 캐시 계층
- 시스템 콜 (System Call) - open(), read(), write(), close() 등 fd 기반 I/O를 수행하는 커널 인터페이스