파일 디스크립터(FD)

  • 시스템으로부터 할당 받은 파일을 대표하는 음수가 아닌 정수 값(0과 양수)
  • 프로세스에서 열린 파일의 목록을 관리하는 테이블의 인덱스

유닉스 시스템에서는 모든 객체들을 파일이라고 한다. 일반적인 정규파일에서부터 디렉토리, 소켓, 파이프, 블록 디바이스, 캐릭터 디바이스 등등 모든 객체들은 파일로써 관리된다. 유닉스 시스템에서 프로세스가 이 파일들을 접근할 때에 파일 디스크립터라는 개념을 이용한다.

(getchar, socket, scanf도 파일로부터 읽어들이는 형태이다. fscanf만 파일로부터 읽어오는 것이 아니다. scanf는 Console에서 추상화한 file에서 H/W(키보드)에서 입력을 받아 BUFFER에 저장된 것을 형식문자에 맞춰 그것을 가져오는 것이 scanf 이다.)

응용 프로세스가 파일을 열거나 생성 하게 되면 정수로 된 파일 디스크립터를 얻게 되는데 이 파일 디스크립터는 이 후에 일어나는 모든 파일 동작 즉, 읽기, 쓰기, 파일 동작제어(fcntl()), 파일 닫기(close()) 등의 동작에서 그 파일을 가리키는데 사용된다. 0, 1, 2는 프로세스가 메모리에서 실행을 시작할때 기본적으로 할당되는 파일 디스크럽터이다.

기본적으로 할당되는 파일 디스크립터

  • 0 : 표준 입력(Standard Input) / STDIN_FILENO
  • 1 : 표준 출력(Standard Output) / STDOUT_FILENO
  • 2 : 표준 에러(Standard Error) / STDERR_FILENO

그러므로 우리가 생성하는 파일 디스크립터들은 3번부터 차례대로 할당받게 된다. 쉽게 생각하면, 파일 디스크립터는 파일을 다루기 위해서 해당파일의 주소를 참조하여 접근하는 형태라고 생각하면 된다.

fd_table

파일 디스크립터의 값, 즉 fd는 프로세스가 유지하고 있는 FD Table의 index이다. 위의 예제에서 우리는 3이라는 숫자가 나왔다. 그림에서 보듯이 우리는 이 숫자 3을 사용해서 FD Table의 3번째 인덱스로 접근하고, 해당 칸이 가리키는 파일로 가서 원하는 행동을 할 수 있는 것이다. FD Table의 각 칸들은 FD Flag와 File Table Pointer를 가지고 있다.

File Table의 각 칸들은 mode와 inode Table Pointer의 Offset을 가지고 있다. inode Table은 소유자 그룹, 접근 모드(읽기, 쓰기, 실행 권한), 파일 형태, 아이노드 숫자(inode number, i-number) 등 해당 파일에 관한 정보를 가지고 있다.

inode란 무엇일까!? 파일을 기술하는 디스크 상의 데이터 구조로서 파일의 데이터 블록이 디스크 상의 어느 주소에 위치하고 있는가와 같은 파일에 대한 중요한 정보를 갖고 있다. 각각의 inode들은 고유번호(inode number)를 가지고 있어서 파일을 식별할때 사용한다. 터미널에서 ls -i 옵션으로 inode number를 확인할 수 있다.

GET_NEXT_LINE에서의 FD란

GET_NEXT_LINE 줄여서 GNL은 파일로부터 한줄씩 읽는 것을 목표로 한다.

GNL에서 fd는 fd의 개수가 어디까지 증가할수 있는가 어디까지 증가하면 stack 과 heap 영역 메모리에 어떤 영향을 주는가에 대해 생각해 볼 수 있다.