Unix OS에서 네트워크 소켓과 같은 파일이나 기타 입력/출력 리소스에 액세스하는 데 사용되는 추상표현이다.
즉, 시스템으로부터 할당받은 파일이나 소켓을 대표하는 정수(int)다.
재미있는 예시가 있어 이 출처에서 가져왔다.
파일 디스크립터는 음이 아닌 정수(Non-negative Integer)로, 일반적으로 C 프로그래밍 언어 중 형식 int로 표현된다. 음수 값은 "무(無)값" 또는 오류 조건을 나타내기 위해 예약된다.
파일 디스크립터가 왜 숫자인 걸까? 이 형식이 직관적으로 이해가지 않았었다. 이것이 단순히 숫자인 이유는 이것이 결국 "프로세스가 유지하고 있는 file descriptors 테이블의 인덱스"이기 때문이다.
Unix OS 또는 Pintos에서, 기본적으로 파일 오픈 or 소켓 생성 시 부여되는 파일 디스크립터는 3부터 시작한다. 0은 표준 입력, 1은 표준 출력, 2는 표준 에러를 나타내는 표기로 사용된다. 아래의 표를 참고할 수 있다.프로세스가 실행 중에 파일을 open하면, 커널은 해당 프로세스의 파일 디스크립터 숫자 중에 사용하지 않는 가장 작은 값을 할당해 준다.
그 다음 프로세스가 열려 있는 파일에 시스템 콜을 이용해서 접근할 때, 파일 디스크립터 값을 이용해 파일을 지칭할 수 있다.
✅ 여기서 표준 스트림에 대해 잘 몰라 따로 알아봤다. 이곳의 글이 좋았다.
표준 스트림, 표준 입출력이란 그냥 키보드 입력, 모니터 출력 뿐만이 아니라 컴퓨터 프로그램에서 ‘표준적으로’ 입력으로 받고 출력으로 보내는 데이터와 매체를 총칭하는 개념이다. 프로그램들은 많은 경우 어떤 정해진 ‘입력’을 받거나 ‘출력’을 행한다.
스트림(stream)은 프로그램을 드나드는 데이터를 바이트의 흐름으로(byte stream) 표현한 단어다.
프로세스가 현재 사용중인 파일을 관리하기 위한 테이블이며, 프로세스마다 하나씩 가지고 있다. File Table을 가리키는 포인터를 담고 있는 배열이고, 이 배열의 index가 fd이다.
FDT의 각 항목은 FD 플래그와 파일 테이블로의 포인터를 가지고 있다. 이 포인터를 이용하여 FD 를 통해 시스템의 파일을 참조할 수 있는 것이다.
프로세스는 이런 FD 테이블과 파일 테이블의 정보를 직접 고칠 수 없으며, 반드시 커널을 통해서 수정을 해야 한다.
FD의 최대값은 곧 하나의 프로세스(단일 프로그램)에 허용되는 최대 열린 파일 수를 정의하는 상수다. OS마자 다르다.