파일 디스크립터 (FD, File Descriptor)란,
Unix OS에서 네트워크 소켓과 같은 파일이나 기타 입력/출력 리소스에 액세스하는 데 사용되는 추상표현이다.
즉, 시스템으로 부터 할당받은 파일이나 소켓을 대표하는 정수다.
파일 디스크립터는 음이 아닌 정수(Non-negative Integer)로, 일반적으로 형식 int로 C 프로그래밍 언어로 표현된다(음수 값은 "무값" 또는 오류 조건을 나타내기 위해 예약된다).
(Window에서는 file handle이라고 부르고 값은 랜덤하게 할당된다.)
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 테이블과 파일 테이블의 정보를 직접 고칠 수 없으며, 반드시 커널을 통해서 수정을 해야 한다.
FD의 최대값은 OPEN_MAX라는 값이다.
즉, 하나의 프로세스 당 최대 OPEN_MAX개의 파일을 열 수 있다. OPEN_MAX 값은 플랫폼에 따라 다르다.
최대 파일 갯수는 다음의 방법을 사용하여 알아볼 수 있다. 내 mac에서는 2560개의 값이 나왔다.
OPEN_MAX는 단일 프로그램에 허용되는 최대 열린 파일 수를 정의하는 상수다.
Unix 시스템에서 C언어의 OPEN_MAX는 limits.h에 정의돼있다.
OPEN_MAX와 FOPEN_MAX와 _SC_OPEN_MAX는 조금씩 다르다고 한다. (출처)
방법 1) 터미널에서 getconf 명령어로 확인
getconf OPEN_MAX
/* 결과값 */
2560
방법 2) <unistd.h>의 sysconf() 함수로 확인
#include <unistd.h>
#include <stdio.h>
int main(void){
int max;
max = sysconf(_SC_OPEN_MAX);
printf("%d\n", max);
return(0);
}
/* 컴파일 후 결과값 */
2560
스토리 비유하기
(출처 : mintnlatte.tistory.com/266)
전화 한 통만 하면 필요한 논문을 복사해 주는 곳이 있다. 그리고 그곳의 단골손님 영수가 있다. 그런데 이 녀석은 매번 똑같은 논문의 일부분을 복사해 달라고 한다. “아저씨~ ‘고도의 정보화 사회가 되어 가면서, 인간의 삶의 질과 관계된 문제들이 점점 더 그 중요성이 더해짐에 따라 감각, 지각, 사고, 성격, 지능, 적성 등의 인간적 특징들이 고려됐을 때의 인간의 원리에 대한 연구’ 라는 논문 26쪽부터 30쪽까지 복사해 주세요” 이 녀석은 보통 이런 식으로 하루에도 여러 번 주문을 한다. 설상가상으로 말하는 속도도 느린 편이다. 그래서 아저씨가 말씀하시길 “그 논문은 이제부터 너의 18번이다! 그냥 저의 18번 논문 26쪽부터 30쪽까지 복사해 주세요 라고 해라!”영수는 그 이후로도 최소 50자가 넘는 제목의 논문만 복사 주문을 한다. 그 때 마다 아저씨는 논문에 새로운 번호를 할당해 준다(중복되지 않는). 그래야 영수와의 대화 속에서 스트레스를 덜 받을 수 있기 때문이다.
여기서 아저씨는 시스템이고, 영수는 개발자를 의미한다.
그리고 숫자는 파일 디스크립터이고, 논문은 소켓이나 파일을 의미한다.
파일(혹은 소켓)을 생성할 때마다 시스템은 그러한 숫자를 생성해서 건네줄 것이다. 그것이 시스템과 개발자가 편하게 대화하는 방법이 된다.
결국 파일 디스크립터란 시스템이 만들어 놓은 것을 가리키기 좋게 하기 위해 시스템이 우리들에게 건네주는 숫자에 지나지 않는다.
출처
파일 디스크립터
위키피디아 en.wikipedia.org/wiki/File_descriptor
mint&latte, mintnlatte.tistory.com/266
dev-ahn, dev-ahn.tistory.com/96
파일 디스크립터의 OPEN_MAX
Javaer101 www.javaer101.com/article/2890626.html
'Code > 개발지식' 카테고리의 다른 글
Dockerfile 작성 시 캐싱문제 방지하기 (0) | 2021.04.20 |
---|---|
진법 변환과 컴퓨터의 사칙연산 (0) | 2021.01.27 |
아스키코드(ASCII Code) - 컴퓨터의 문자 처리 원리 (0) | 2020.10.07 |
[Vim] Vim ColorScheme 변경하는 방법 (0) | 2020.10.04 |
[Unix, Linux] 자주 사용하는 유닉스 쉘 명령어 (0) | 2020.09.10 |
댓글