이것이 점프 투 공작소

FD(File Descriptor)에 대해 알아보자 본문

리눅스

FD(File Descriptor)에 대해 알아보자

겅겅겅 2022. 12. 5. 21:32

FD(File Descriptor)란?

프로세스에서 열린 파일 목록을 관리하는 테이블의 인덱스입니다.

리눅스, 유닉스 시스템에서는 정규파일, 디렉토리, 소켓, 블록 디바이스 등 모든것을 파일로 취급하여 관리합니다.

시스템에서 프로세스가 파일들에 접근할때 FD를 통해 접근하게 됩니다.

FD는 0이 아닌 정수값으로, 프로세스가 실행중에 파일을 open하면 커널은 해당 프로세스의 FD 숫자 중에 사용하지 않는 가장 작은 값을 할당해줍니다.

 

FD의 특징

  • 0이 아닌 정수값을 가집니다.
  • 파일마다 독립적으로 존재하며, 시스템에 따라 다른 구조를 가집니다.
  • 대게 보조기억장치에 저장되어 있다가 파일이 열릴때 주기억장치로 이동합니다.
  • 프로세스 실행시 기본적으로 0(표준입력),1(표준출력),2(표준에러) 의 FD가 할당됩니다. (<unistd.h> 파일 참조) 
  • 프로세스가 FD를 할당받게되면 3번부터 OPEN_MAX값까지 차례대로 할당받습니다. 
  • (OPEN_MAX값은 플랫폼에 따라 다릅니다)

 

File Descriptor 테이블이란?

FD와 파일 테이블로의 포인터를 가지고있는 테이블입니다. FD는 이 배열의 인덱스입니다.

    -  프로세스는 FD테이블을 통해 파일을 참조합니다.

    -  프로세스마다 FD테이블을 가지고 있습니다.

File 테이블이란?

모든 열려진 파일들을 관리하는 테이블입니다.

    - 파일의 상태 flags와 현재 파일의 작업 offset과 파일의 vnode 테이블의 위치정보가 존재합니다.

    - vnode 테이블은 inode정보와 현재 파일의 크기를 가집니다.

 

하나의 프로세스에서 같은 파일을 2번 열게 되면

    - 2개의 FD, 파일offset 할당

    - 동일한 vnode 참조

 

 

FD 할당 과정

1. 프로세스가 특정 파일에 특정 권한 및 명령을 요청합니다.

 

2. 커널은 File System에서 해당 파일의 i-node를 가져와 v-node테이블에 할당합니다.

 

3.  i-node에 정보에 담겨있는 접근권한을 찾아 프로세스가 요청한 권한을 허용하는지 확인 후,

     file table의 entry에 파일의 상태 flag, 작업 offset, 파일의 vnode 테이블 위치 정보 등을 할당합니다.

 

4. file table에 file table entry를 가리키는 포인터를 저장합니다. (순서대로 할당 3부터 시작)

 

5. 저장한 곳의 인덱스를 반환합니다.

 

프로세스의 FD 조회

/proc : 커널이 메모리에 만들어 놓은 가상의 파일시스템입니다.

1번 프로세스의 FD확인