Jungle

[TIL] 파일 디스크립터

손가든 2023. 11. 21. 15:12

오늘은 파일 디스크립터에 대해 공부 해보자.

 

파일 디스크립터는 이전 포스팅들에서 클라이언트 소켓과 서버 소켓을 만들 때, fd라는 키워드로 확인할 수 있었다.

 

그렇다면 파일 디스크립터라는 존재는 무엇을 위해 존재할까?

 

 


 

파일 디스크립터란?

유닉스 시스템에서는 모든 것을 파일이라고 한다.

(정규파일 , 디렉토리 , 소켓 , 파이프 , 블록 디바이스 , 캐릭터 디바이스 등의 객체들)

 

파일 디스크립터란 유닉스 혹은 리눅스 쪽의 시스템에서 Process -> File을 다룰 때 사용하는 개념으로,

 

Process가 파일에 접근 시에 사용하는 추상적인 값이다.

 

..

 

이게 뭔소리지?

 

 

이 말에 대해 완벽하게 이해하기 힘들기 때문에 프로세스가 작업 중 파일을 다룰 때 어떤 방식으로 해당 여러 파일을 보관하는지 이해할 필요가 있다.

 

 

우리가 알고리즘 문제를 풀때, 해당 값들을 기억하는 배열을 생성해서 저장하곤 한다.

 

운영체제에도 마찬가지로 파일 디스크립터 테이블이라는 것을 배열처럼 가지고 있는데,

 

파일을 열면 프로세스가 해당 파일을 열었다는 것을 기억하기 위해

 

커널이 운영체제 내부의 파일 디스크립터 테이블에 저장한 뒤 index를 반환하는 것이다.

 

이 때, 이 index가 파일 디스크립터이다.

 

 

프로그램이 프로세스로 메모리에서 실행될 때, 기본적으로 할당되는 파일 디스크립터는 표준입력(stdin) , 표준출력(stdout) , 표준에러(stderr)이며 이들은 각각 0,1,2 인덱스 테이블에 저장되어 있다.

 

 

따라서 0~2번은 테이블에 고정된 상태에서

 

프로세스가 파일을 open하거나 소켓을 생성하는 작업(소켓도 하나의 파일이므로 이 또한 파일을 연다고 할 수 있다)을 수행하면

 

커널이 해당 프로세스의 파일 디스크립터 숫자 중에 사용중이지 않은 가장 작은 수를 할당 해준다.

 

 

이 말은 다르게 해석하면 테이블의 비어있는 가장 작은 인덱스에 방금 연 파일을 저장해두고 인덱스를 반환해준다고 할 수 있다.

 

이후 해당 파일을 다루고 싶다면 기억해둔 인덱스를 통해 파일을 요청하여 파일 입출력 작업을 수행하는 것이다.

 

 

따라서 FD는 0 이상의 정수로 표현되며, 음수는 Error 조건이나 없는 값을 나타내기 위해 사용된다.