콘텐츠로 이동

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 구조체를 공유한다 (오프셋 공유)
1 open()
경로명으로 파일을 열고 fd 반환 (0부터 시작하는 작은 정수)
2 read() / write()
fd를 사용해 현재 오프셋에서 I/O 수행, 오프셋 자동 갱신
3 close()
fd 해제, 참조 카운트 감소
fd이름용도
0stdin표준 입력
1stdout표준 출력
2stderr표준 에러

리다이렉션 ls > file은 stdout(fd 1)을 file로 교체한다.

파일 디스크립터는 “티켓 번호”와 같다. 식당(커널)에 줄 서서 번호표(fd)를 받으면, 이후 서비스(I/O)를 받을 때 번호만 부르면 된다.

  • 작은 정수로 빠른 인덱싱
  • 디바이스, 파이프, 소켓 등도 동일 인터페이스로 처리 (“모든 것이 파일”)
  • fork() 시 자식에게 상속 → IPC 용이
  • 단점: fork() 후 부모-자식 간 오프셋 공유 (의도치 않은 동작 가능), 프로세스당 fd 개수 제한