본문 바로가기

programming/OS (Linux, Windows)

[Linux] File Descriptor

언젠가 그런 질문을 받은적이 있었다.

 

'프로그래밍을 한다면 당연히 알아야할, File descriptor 에 대하여 물어볼게요.'

 

당연히 SI 하청 시장에서 길면 3달, 짧으면 한달 주기로 팔려다니며 경력 1년을 갖 만든 당시 나로써는 알 방법이 없었다.

물론 질문을 받고 바로 다음날 찾아보았다.

그러나 이해가 가지 않는 것은 당연했다.

 

그로부터 대략 1년이 넘게 지났다.

만일 내가 아직도 그 시장속에 있었다면 알 수 없었을 파일 디스크립터에 대해 이제는 설명은 못해도 그게 뭔지는 느낌이 온다고 할 수 있다. 문득 그 분이 얼마나 중요한 내용을 짚어 주셨나 감회가 새롭다.

 


1. 기본 이론

  1) File descriptor 의 정의

 

우선 위키피디아의 설명을 좀 읽어 보도록 하자.

 

https://en.wikipedia.org/wiki/File_descriptor#Creating_file_descriptors

 

File descriptor - Wikipedia

In Unix and related computer operating systems, a file descriptor (FD, less frequently fildes) is an abstract indicator (handle) used to access a file or other input/output resource, such as a pipe or network socket. File descriptors form part of the POSIX

en.wikipedia.org

요약하면 아래와 같다.

 

    - FD(이하 File-Descriptor)는 OS 에서 사용되는 추상적 인디케이터

    - 파일, 입출력 리소스, 파이프, 네트워크 소켓 등도 FD의 대상이다.

    - FD 의 값은 음이 아닌 정수가 일반적이다.

 

추상적 인디케이터. 참 모호한 표현이다.

추상화라는 표현도 모호한 표현인데 지시자(인디케이터)라니...

의외로 생각해보면 간단하다.

 

유닉스 계열 대부분의 OS 들(이하 윈도우, 리눅스를 포함)은 파일과 외부 장치, 소켓등을 모두 파일하고 동일하게 본다. 다시말해, a.txt 가 열린것과 a포인터 장치를 USB로 연결하는 것들이 모두 파일의 오픈으로 볼 수 있다는 것이다.

이러한 파일들이 몇개나 열려 있는지 OS 입장에서는 관리할 필요성이 있다.

 

FD는 우리가 잘 알던 파일만 아니라 유닉스 계열 OS(정확히는 커널)에서 다루는 모든 종류의 파일의 정보를 볼 수 있는 테이블이라고도 볼 수 있다.

 

 

  2) File descriptor 에서 0, 1, 2 는 왜 사용할 수 없나요?

 

상기 첨부한 링크에 보면 상단에 나와 있다.

FD 값 내용 기타
0 Standard input  
1 Standard output  
2 Standard error  

 

FD는 OS에서 관리하는 것이라고 이야기한 만큼 당연히 시스템이 부팅하고나서 사용자와 인터렉션및 명령을 처리하면서 발생하는 모든 파일들을 관리하게 된다. 그중 가장 먼저 만나게 되는 새로운 파일이 바로 외부 디바이스(입출력)가 될 것이다. 사실 순서와는 상관없이 3개의 값은 고정이다. 키보드와 마우스를 모두 뽑아도 0번이 안쓰이는 일은 없다.

 

다만 이후 열어야 하는 파일은 0,1,2 를 제외한 정수들을 적용해가며 열고 닫고를 반복한다.

 

열린 파일이 어디 무엇이고 어디의 어떤 파일인지, 뭘 하고 있는지는 프로그래머라면 당연히 관심을 가져야 할 것이다.

 


2. File descriptor 는 왜 중요할까?

  1) File descriptor 가 열린 파일을 강제 삭제하는 경우

 

메모리 누수가 발생한다.

한번 웹서버에 c로 짜여진 모듈의 로그를 지웠다가 퇴근을 못하고 배운게 이거다.

 

어떤 프로세스가 열심히 쓰고 있는 파일을 갑자기 지우려하면 원래는 지워지지 않거나 지워져도 로그는 기록되기 마련인데 뭐 특별히 그런거를 싫어하는 부류의 프로그램도 존재하나보다.

 

문제는 파일보다는 디바이스다.

외부 디스크나 통신 프로그램도 하나의 파일로 인식하는데, 이를 강제로 삭제하거나 이동하는 경우

프로그램은 실행도 되지 못하고 정상종료도 되지 못한채 메모리 누수의 원인이 될 수 있다.

 

소켓 프로그래밍을 공부할 때 반드시 소켓을 open하면 종료시점에 close를 하라고 배운다.

사실 이는 파일도 마찬가지다.

방금 1번에서 이야기 된 것처럼, 소켓이나 파일은 동일하게 처리되기 때문이다.

정상종료되지 않은 특정 프로세스의 파일디스크립터는 전체 시스템이 죽기까지 메모리에 상주하며 모두를 괴롭힐 것이다.

 


 

역시 사람은 고통을 느껴야 배우는 동물인것 같다. 

 

 

참고 : https://stackoverflow.com/questions/25819226/what-is-the-difference-between-inode-number-and-file-descriptor

 

What is the difference between inode number and file descriptor?

I understand file descriptors are kernel handle to identify the file , while inode number of a file is pointer to a structure which has other details about file(Correct me if I am wrong). But I am ...

stackoverflow.com

참고2 : https://kldp.org/node/87172

 

[완료] file descriptor 의 원리.. | KLDP

int fd; fd=open("test.txt", O_RDWR); write( fd , buf , 1000 ); 이런식으로.. 파일에 데이타를 기록하게 되는데.. write 를 어디에다 하게 될지를.. file descriptor 가 가리키는 파일에다 기록을 하게 되는데.. fd 가 단순한 int 인데 ( 처음 open 을 하면.. 3 이 리턴이 되죠..) 3 이라는 숫자가.. 어떻게 test.txt 파일과 매핑이 되는지 궁금합니다.. C 에서 어떻게 구

kldp.org

 

반응형