전체 목록
운영체제Medium#202

파일 디스크립터(File Descriptor)는 무엇인가요?

#운영체제#FileDescriptor#I/O#리소스

답변 포인트

열린 리소스 핸들과 누수 관리를 기준으로 정의, 장점, 한계, 예시를 함께 설명해보세요.

정답 및 해설

빠른 요약

파일 디스크립터는 프로세스가 열린 파일, 소켓, 파이프 등을 식별하는 정수 핸들입니다. 닫지 않으면 디스크립터 누수로 리소스 고갈이 발생할 수 있습니다.

파일 디스크립터는 프로세스가 열린 파일, 소켓, 파이프, 터미널 등을 가리키기 위해 사용하는 작은 정수 핸들입니다. Unix 계열 OS에서는 “거의 모든 I/O 대상은 파일처럼 다룬다”는 모델을 사용하기 때문에 FD는 운영체제 I/O의 핵심 개념입니다.

기본 구조

프로세스마다 파일 디스크립터 테이블이 있고, 각 번호는 커널 내부의 열린 파일 객체를 가리킵니다.

Text
 FD 
0 -> stdin
1 -> stdout
2 -> stderr
3 -> /var/log/app.log
4 -> TCP socket 10.0.0.5:443

표준 입력/출력/에러가 각각 0, 1, 2번인 것도 이 모델 때문입니다.

코드 예시

C
int fd = open("data.txt", O_RDONLY);
if (fd == -1) {
    perror("open");
    return 1;
}

char buf[1024];
ssize_t n = read(fd, buf, sizeof(buf));
close(fd);

fd 자체는 파일 내용이 아니라 커널 객체를 참조하는 번호입니다. 같은 파일을 두 번 열면 서로 다른 FD가 만들어질 수 있고, dup()을 사용하면 여러 FD가 같은 열린 파일 객체를 공유할 수도 있습니다.

소켓도 FD입니다

JavaScript
// Node.js의 net.Socket도 내부적으로는 OS 소켓 FD를 사용한다.
const net = require('net');
const server = net.createServer((socket) => {
  socket.write('hello\n');
  socket.end();
});
server.listen(3000);

애플리케이션에서는 객체로 보이지만, 커널 레벨에서는 소켓 FD가 생성되고 accept, read, write, close 같은 시스템 콜로 처리됩니다.

실무에서 중요한 이유

  • FD는 무한하지 않습니다. Linux에서는 ulimit -n으로 프로세스당 한도를 확인합니다.
  • 파일이나 소켓을 닫지 않으면 FD 누수가 발생해 신규 연결을 받지 못합니다.
  • close() 타이밍을 잘못 잡으면 아직 쓰는 소켓이 끊기거나 로그 파일이 사라진 것처럼 보일 수 있습니다.
  • 부모/자식 프로세스가 FD를 상속하면 의도치 않게 파일 잠금이나 포트 점유가 유지됩니다.
Bash
ulimit -n
lsof -p <PID> | head

장애 대응에서는 위 명령으로 열린 FD 수와 종류를 확인하는 일이 많습니다.

면접 답변 포인트

파일 디스크립터는 “프로세스가 커널의 열린 I/O 객체를 참조하기 위한 정수 핸들”이라고 정의하고, 표준 입출력 0/1/2, 파일/소켓/파이프 공통 모델, FD 누수와 한도 관리까지 언급하면 실무 감각이 있는 답변이 됩니다.

관련 질문

같은 카테고리/태그 기준