- 파일 디스크립터란?
- 시스템으로부터 할당받은 파일을 대표하는 0이아닌 정수값
- 프로세스에서 열린 파일의 목록을 관리하는 테이블의 인덱스
- 흔히 유닉스 시스템에서 모든것을 파일이라고 한다.
- 일반적인 정규파일(Reglular File) 에서부터 디렉토리(Directory), 소켓(Socket), 파이프(PIPE), 블록 디바이스, 캐릭터 디바이스 등등 모든 객체들은 파일로써 관리된다.
- 유닉스 시스템에서 프로세스가 이 파일들을 접근할때 파일 디스크립터(File Descriptor)라는 개념을 이용한다.
- 파일 디스크립터는 '0'이아닌 정수, 'Non-negative Integer' 값이다. 즉, 음수가 아닌 0과 양수인 정수 값을 갖는다. (unsigned int 값이다.)
- 프로세스가 실행 중에 파일을 open 하면 커널은 해당프로세스의 파일 디스크립터 숫자 중에 사용하지 않는 가장 작은 값을 할당해준다.
- 그 다음 프로세스가 열려있는 파일에 시스템 콜을 이용해서 접근할 때, FD(해당 프로세스의 open file을 관리하는 구조체 배열의 index)값을 이용해 지징 할 수 있다.
- 시스템으로부터 할당받은 파일을 대표하는 0이아닌 정수값
- 프로그램이 프로세스로 메모리에서 실행을 시작 할 떄, 기본적으로 할당되는 파일 디스크립터들이 있다.
- 바로 표준 입력, 표준 출력, 표준 에러이다. 이들에게 각각 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값을 공유 한다.
'운영체제,컴퓨터구조' 카테고리의 다른 글
멀티스레드를 사용하는 이유 (0) | 2020.12.15 |
---|---|
프로세스, 스레드의 컨텍스트 스위칭 cpu와의 관계 (0) | 2020.08.08 |
[펌]리눅스 명령어 기초 및 모음 (0) | 2020.03.01 |
DB, Application Server(was) 성능측정 (0) | 2020.03.01 |
성능분석의 기본 명령어 (0) | 2020.03.01 |