[SW사관학교 정글]67일차 TIL - file descriptor

김승덕·2022년 11월 24일
0

SW사관학교 정글 5기

목록 보기
107/150
post-thumbnail

file descriptor

개념

💡 파일 디스크립터는 리눅스 혹은 유닉스 계열의 시스템에서 프로세스가 파일을 다룰때 사용하는 개념이다. 특정 파일에 접근할때 사용하는 추상적인 값이다. 파일 디스크립터는 일반적으로 음수가 아닌 0과 양수인 정수값을 갖는다는 말이다.(즉 c언어에서 int로 표현됨)

유닉스 시스템에서는 모든것을 파일이라고한다. 일반적인 정규파일(Regular File)에서부터 디렉토리(Directory), 소켓(Socket), 파이프(PIPE), 블록 디바이스, 캐릭터 디바이스 등등 모든 객체들은 파일로써 관리된다. 유닉스 시스템에서 프로세스가 이 파일들을 접근할 때에 파일 디스크립터(File Descriptor)라는 개념을 이용한다.

프로세스가 실행중인 파일을 Open하면 커널은 해당 프로세스의 파일 디스크립터 숫자 중에 사용하지 않는 가장 작은 값을 할당해준다. 그 다음 프로세스가 열려있는 파일에 시스템 콜을 이용해서 접근할 때, 파일 디스크립터 값을 이용해 파일을 지칭할 수 있다.

프로그램이 프로세스로 메모리에서 실행을 시작할 때 기본적으로 할당되는 파일 디스크립터들이 있다. 바로 표준 입력, 표준 출력, 표준 에러이다. 이들에게 각각 0, 1, 2라는 정수가 할당되며, POSIX 표준에서는 STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO로 참조된다. 즉 FD의 0번에서 2번까지는 고정되어있다. 이 매크로는 <unistd.h> 헤더 파일에서 찾아 볼 수 있다. 0이 아닌 정수로 표현되는 파일 디스크립터는 0 ~ OPEN_MAX 까지의 값을 가질 수 있으며, OPEN_MAX 값은 플랫폼에 따라 다르다.

파일 디스크립터는 아래 그림을 보면서 이해하면 좋다. 파일 디스크립터가 단순히 숫자인 이유는 프로세스가 유지하고 있는 FD(파일 디스크립터, 이하 FD) 테이블의 인덱스이기 때문이다. FD 3번이라는 의미는 FD 테이블의 3번 항목이 가리키는 파일이라는 의미이다. FD 테이블의 각 항목은 FD 플래그와 파일 테이블로의 포인터를 가지고있다. 이 포인터를 이용하면 FD를 통해 시스템의 파일을 참조할 수 있는 것이다.

프로세스는 이런 FD 테이블과 파일 테이블의 정보를 직접 고칠수 없으며, 반드시 커널을 통해서 수정해야 한다.

참고 자료

리눅스 - 파일 디스크립터

파일 디스크립터(File Descriptor)란?

profile
오히려 좋아 😎

0개의 댓글