파일 디스크립터(FD, File Descriptor)
Unix OS에서 네트워크 소켓과 같은 파일이나 기타 입력/출력 리소스에 액세스 하는 데 사용되는 추상 표현이다.
즉, 시스템으로 부터 할당받은 파일이나 소켓을 대표하는 정수다.
- 파일을 대표하기 위해 시스템으로부터 할당 받은 음수가 아닌 0과 양수인 정수 값(Non-negative Integer)
- 프로세스에서 열린 파일의 목록을 관리하는 테이블의 인덱스
유닉스 시스템에서 모든 것이 파일이다.
• 정규 파일(Regularfile), 디렉토리(Directory), 소켓(Socket), 파이프(PIPE), 블록 디바이스(Block Device), 캐릭터 디바이스(Character Device) 등등 모든 객체들을 파일로써 관리된다
• 유닉스 시스템에서 프로세스가 이 파일들을 접근할 때 File Descriptor라는 개념을 이용한다
응용 프로세스가 파일을 열거나 생성 하게 되면 정수로 된 파일 디스크립터를 얻게 되는데 이 파일 디스크립터는 이후에 일어난 모든 파일 동작 즉, 읽기(read), 쓰기 (write), 파일 동작 제어(fnctl 함수), 파일 닫기(close 함수) 등의 동작에서 그 파일을 가리키는데 사용된다.
파일 디스크립터 종류
FD의 0번에서 2번까지는 고정되어 있다. (unistd.h 헤더파일에 명시) 각 Unix 프로세스는 세 가지 standard streams에 해당하는 고정된 standard POSIX file descriptors를 가진다.
표준입력 및 표준출력도 파일 디스크립터로 표현이 되는데 이들은 프로그램이 시작되면 기본적으로 열리고, 종료 시 자동으로 닫힌다.
- 표준 입력(Standard Input) : File Descriptor 0
- 표준 출력(Standard Output) : File Descriptor 1
- 표준 에러 출력(Standard Error) : File Descriptor 2
파일 디스크립터가 단순히 숫자인 이유는 프로세스가 유지하고 있는 file descriptors 테이블의 인덱스이기 때문이다.
파일 오픈 or 소켓생성 시 부여되는 파일 디스크립터는 3부터 시작한다.
프로세스가 실행 중에 파일을 Open 하면 커널은 해당 프로세스의 파일 디스크립터 숫자 중에 사용하지 않는 가장 작은 값을 할당해 준다.
그 다음 프로세스가 열려있는 파일에 시스템 콜을 이용해서 접근할 때, 파일 디스크립터 값을 이용해 파일을 지칭할 수 있다.
쉽게 생각하면, 파일 디스크립터는 파일을 다루기 위해서 해당 파일의 주소를 참조하여 접근하는 형태라고 생각하면 된다.
file descriptors 테이블의 각 항목은 FD 플래그와 파일 테이블로의 포인터를 가지고 있다.
이 포인터를 이용하여 FD 를 통해 시스템의 파일을 참조 할 수 있는 것이다.
프로세스는 이런 FD 테이블과 파일 테이블의 정보를 직접 고칠 수 없으며, 반드시 커널을 통해서 수정을 해야 한다.
참고 블로그
'42Seoul > get_next_line' 카테고리의 다른 글
6. Mandatory part, Bonus part source code (2) | 2023.04.08 |
---|---|
5. 운영체제에 따른 read (0) | 2023.04.08 |
4. 정적 변수(static) (0) | 2023.04.08 |
3. 파일 디스크립트 함수(open, read, close) (0) | 2023.04.08 |
2. OPEN_MAX, 연결리스트 vs 배열 (2) | 2023.04.08 |