운영체제에서 File Descriptor(파일 디스크립터) 는 파일, 소켓, 파이프 등의 자원을 참조하기 위한 정수(integer) 핸들이다.
C 언어나 유닉스 계열 시스템 프로그래밍에서는 파일을 열거나 생성할 때, 정수 형태의 고유 번호가 반환되며, 이 값을 통해 입출력을 제어할 수 있다.
쉽게 말해, “운영체제가 리소스를 추상화해서 핸들링할 수 있게 해주는 숫자” 다.
| 디스크립터 번호 | 의미 |
|---|---|
0 | 표준 입력 (stdin) |
1 | 표준 출력 (stdout) |
2 | 표준 에러 (stderr) |
프로세스가 시작되면 이 세 가지 디스크립터는 기본적으로 열려 있으며, 이를 통해 터미널 입출력이 가능하다.
int fd = open("test.txt", O_RDONLY);
read(fd, buf, sizeof(buf));
close(fd);
open() 함수는 파일을 열고, 파일 디스크립터(fd) 를 반환read(), write(), lseek(), close() 등의 시스템 콜은 이 fd를 통해 동작내부적으로는 파일 디스크립터 테이블 → 파일 테이블 → VFS 구조체 → 디바이스 드라이버 순으로 연결된다.
프로세스마다 파일 디스크립터 테이블(File Descriptor Table) 을 가지고 있으며,
이는 열려 있는 모든 파일(또는 I/O 자원)에 대한 포인터를 저장하는 배열이다.

0, 1, 2 ... 와 같은 정수 값| 항목 | File Descriptor (int) | File Pointer (FILE *) |
|---|---|---|
| 라이브러리 | 시스템 콜 (open) | 표준 I/O (fopen) |
| 사용 방식 | read(), write() 등 | fscanf(), fprintf() 등 |
| 버퍼링 | 비버퍼링 | 사용자 공간 버퍼링 있음 |
| 속도 | 빠름 (저수준) | 느림 (고수준) |
fopen()등은 내부적으로open()을 호출하여 디스크립터를 얻고, 사용자 버퍼를 추가로 구성함
dup(), dup2() 등을 활용하면 표준 출력 리디렉션 등의 기능도 쉽게 구현 가능int fd = open("output.txt", O_WRONLY);
dup2(fd, 1); // stdout을 output.txt로 리디렉션
printf("이 메시지는 파일로 출력됩니다.\n");
표준 출력
1(stdout)을output.txt파일로 덮어씀 → 이후printf()는 터미널 대신 파일에 출력됨
| 함수 | 설명 |
|---|---|
open() | 파일 열기, 디스크립터 반환 |
read() | 디스크립터로부터 데이터 읽기 |
write() | 디스크립터에 데이터 쓰기 |
close() | 디스크립터 닫기 |
dup() | 디스크립터 복제 |
dup2() | 특정 번호로 복제 (1 → fd 등) |
fcntl() | 디스크립터 속성 설정 |