파일 디스크립터 [ 크래프톤 정글 52일차 ]

jinsung·2025년 7월 3일

크래프톤 정글 9기

목록 보기
47/59

CSAPP 10장인 시스템 수준의 입출력에 대해서 공부하고 있는데요.

"열린 파일이나 I/O 자원을 가리키는" 파일 디스크립터에 대해서 설명해보려고 합니다.

파일 디스크립터

fd = open("foo.txt" , O_WRONLY|O_APPEND , 0)
printf("%d" , fd ) // 3

시스템 콜인 open 을 사용하면
정수값 3이 return 된 것을 볼 수 있어요.

저 값이 파일 디스크립터 입니다.

각각의 프로세스는 이런 Descripto table 을 가지고 있어요.

fd 로 적힌 부분이 파일 디스크립터 번호이고
파일 디스크립터는 0이상의 양의 정수로 이루어져 있어요.

파일 디스크립터의 0,1,2 는 각각
stdin stdout stderr 로 고정되어 있답니다.

우리가 시스템 콜 open을 사용했다는 건 "파일을 열었다"라는 뜻이겠죠?
이렇게 프로세스가 파일을 "열면" 커널은 해당 파일에 대한 정보를 저장하고 그걸 참조하기 위한 값 파일 디스크립터를 반환하는겁니다.

사용 예시 (C 코드)

#include <fcntl.h>
#include <unistd.h>

int main() {
    int fd = open("test.txt", O_RDONLY); // 파일을 열면 fd에 정수 반환됨
    if (fd == -1) return 1;

    char buf[100];
    int n = read(fd, buf, sizeof(buf)); // fd를 통해 읽기
    write(1, buf, n); // 표준출력으로 출력

    close(fd); // 사용 후 닫아줘야 자원 누수 방지
    return 0;
}
  • open() → 파일 디스크립터 반환 (ex: 3, 4, 5 ...)
  • read(fd, buf, size) → fd에 해당하는 파일에서 읽음
  • write(fd, buf, size) → fd에 해당하는 파일/장치로 씀
  • close(fd) → 사용 완료된 디스크립터 해제

파일 디스크립터는 내부적으로 이런식으로 연결됩니다.

  1. 각각의 프로세스가 가장 왼쪽에 있는 Descriptor table을 각각 가지고 있습니다.
  2. Descriptor table은 모든 프로세스가 공유하는 Open file table을 가리키고 있어요.
  3. Open file table에는 offset,mode,v-node로의 포인터 등 파일에 대한 정보가 있습니다.
  4. v-node table에는 실제 파일의 내용과 위치 등 상세한 파일 정보가 담겨있습니다.

왜 따로 나눴을까?

나눈 목적은 파일을 여러 프로세스에서 공유하기 위함이예요.

계층이유공유 여부
① 프로세스의 open file table같은 프로세스 내에서만 접근 가능하게프로세스마다 독립
② System-wide open file tableoffset 등 공유하고 리소스 낭비 줄이기여러 프로세스가 공유 가능
③ inode table파일 시스템의 정보는 공통이어야 하니까모든 프로세스가 공유

모든 프로세스가 각각 접근하는 open file table 파일 정보가 공유되어서 리소스 낭비를 줄이기 위함이고

inode table 을 사용해서 모든 파일에 대한 정보를 공유하게끔 만든거예요.

  • 유연하게 공유/독립을 조절하고
  • 프로세스는 자기만의 fd를 가지고
  • 필요 시 offset이나 모드 등은 공유할 수 있고
  • 파일 자체 정보는 시스템 전체에서 공유해야 하니까

마무리

파일 디스크립터 자체에 대한 개념은 어렵지 않기 때문에 이해하고 있다면 좋을 것 같습니다.

1개의 댓글

comment-user-thumbnail
2025년 7월 3일

C 공부하니까 자바스크립트 그리워....

답글 달기