운영체제 | File Descriptor

성수당·2025년 9월 12일

운영체제

목록 보기
14/31
post-thumbnail

🥔 File Descriptor란?

운영체제에서 File Descriptor(파일 디스크립터)파일, 소켓, 파이프 등의 자원을 참조하기 위한 정수(integer) 핸들이다.
C 언어나 유닉스 계열 시스템 프로그래밍에서는 파일을 열거나 생성할 때, 정수 형태의 고유 번호가 반환되며, 이 값을 통해 입출력을 제어할 수 있다.

쉽게 말해, “운영체제가 리소스를 추상화해서 핸들링할 수 있게 해주는 숫자” 다.

🥔 파일 디스크립터의 기본 구조

디스크립터 번호의미
0표준 입력 (stdin)
1표준 출력 (stdout)
2표준 에러 (stderr)

프로세스가 시작되면 이 세 가지 디스크립터는 기본적으로 열려 있으며, 이를 통해 터미널 입출력이 가능하다.

🥔 File Descriptor의 작동 방식

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 vs File Pointer

항목File Descriptor (int)File Pointer (FILE *)
라이브러리시스템 콜 (open)표준 I/O (fopen)
사용 방식read(), write()fscanf(), fprintf()
버퍼링비버퍼링사용자 공간 버퍼링 있음
속도빠름 (저수준)느림 (고수준)

fopen() 등은 내부적으로 open()을 호출하여 디스크립터를 얻고, 사용자 버퍼를 추가로 구성함

🥔 파일 디스크립터의 장점

  • 파일뿐 아니라 소켓, 파이프, 터미널, 디바이스 등 다양한 리소스를 추상적으로 다룰 수 있음
  • 정수 하나로 자원을 식별하므로 프로세스 간 통신, 멀티플렉싱(select, epoll 등) 에 유리함
  • 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()특정 번호로 복제 (1fd 등)
fcntl()디스크립터 속성 설정

🥔 마무리

  • File Descriptor 는 운영체제가 제공하는 핵심적인 리소스 접근 수단
  • 모든 입출력의 시작은 이 디스크립터에서 출발하며, OS 내부 구조와도 밀접하게 연결된다
  • 실제 시스템 프로그래밍에서는 디스크립터를 적절히 관리하지 않으면 리소스 누수 또는 에러 처리 미흡 문제가 발생할 수 있다
profile
말하는 감자🥔

0개의 댓글