• 파일 디스크립터란?
    • 시스템으로부터 할당받은 파일을 대표하는 0이아닌 정수값

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

    • 흔히 유닉스 시스템에서 모든것을 파일이라고 한다.

    • 일반적인 정규파일(Reglular File) 에서부터 디렉토리(Directory), 소켓(Socket), 파이프(PIPE), 블록 디바이스, 캐릭터 디바이스 등등 모든 객체들은 파일로써 관리된다.

    • 유닉스 시스템에서 프로세스가  파일들을 접근할때 파일 디스크립터(File Descriptor)라는 개념을 이용한다.

    • 파일 디스크립터는 '0'이아닌 정수, 'Non-negative Integer' 값이다. , 음수가 아닌 0 양수인 정수 값을 갖는다. (unsigned int 값이다.)

    • 프로세스가 실행 중에 파일을 open 하면 커널은 해당프로세스의 파일 디스크립터 숫자 중에 사용하지 않는 가장 작은 값을 할당해준다.

    •  다음 프로세스가 열려있는 파일에 시스템 콜을 이용해서 접근할 , FD(해당 프로세스의 open file 관리하는 구조체 배열의 index)값을 이용해 지징   있다.
       
  • 프로그램이 프로세스로 메모리에서 실행을 시작 할 떄, 기본적으로 할당되는 파일 디스크립터들이 있다.
  • 바로 표준 입력, 표준 출력, 표준 에러이다. 이들에게 각각 0,1,2라는 정수가 할당되며,  매크로는 <unitsh.h> 헤더에서 찾아 볼 수있다.
  • 0 아닌 정수로 표현되는 파일 디스크립터는 0~ OPEN_MAX까지 값을 가진다.
     

  • 정리하자면 파일 디스크립터는 파이프, FIFO, 소켓, 터미널, 디바이스, 일반파일 등 종류에 상관없이 모든 열려있는 파일을 참조할때 쓴다.

파일디스크립터 

목적 

POSIX 이름 

stdio 스트림 

 0

 표준 입력

 STDIN_FILENO

 stdin

 1

 표준 출력

 STDOUT_FILENO

 stdout

 2

 표준 에러

 STDERR_FILENO

 stderr

 

  • 표에 있는 3가지 디스크립터는 프로그램이 시작할때 셸의 디스크립터의 복사본을 상속 받고, 셸은 보통 3가지 파일 디스크립터가 언제나 열린채로 동작 한다.
  • 프로그램에서 파일 디스크립터를 참조할때는 번호(0,1,2)를 쓸 수도 있지만 가능하면 "UNISTD.H"에 정의된 POSIX 이름을 쓰는편이 좋다..

 

  • 파일 디스크립터와 열려 있는 파일의 관계
    • 각 프로세스별로 커널은 open file descriptor table 을 갖고 있다. 테이블의 각 엔트리는 하나의 파일 디스크립터에 대한 동작 제어 플래그, 열린 파일을 가리키는 참조를 담고 있다.
    • open file description은 현재 파일의 offset, flag, 접근 모드, i/o 관련 설정, 파일의 i-node 객체를 가리키는 레퍼런스를 갖고 있다.
    • i-node는 파일 종류 (일반파일, 소켓, fifo)와 권한, lock 목록 포인터, 여러 파일 오퍼레이션과 다양한 파일 속성(크기, 타임스탬프등)을 갖고 있다.
    • 만약 같은 open file description을 가리키는 2개의 fd는 offset값을 공유 한다.

+ Recent posts