파일 디스크립터

OS/리눅스 & 유닉스 2011. 12. 27. 16:59

파일 디스크립터   

프로그래밍을 한다면 당연히 파일디스크립터를 모르면 안되겠죠.

File descriptor

From Wikipedia, the free encyclopedia

In computer programming, a file descriptor is an abstract indicator for accessing a file. The term is generally used in POSIX operating systems. In Microsoft Windows terminology and in the context of the C standard I/O library, "file handle" is preferred, though the latter case is technically a different object (see below).

In POSIX, a file descriptor is an integer, specifically of the C type int. There are 3 standard POSIX file descriptors which presumably every process (save perhaps a daemon) should expect to have:


파일 디스크립터에 대해서 좀더 알아 보시려면 위키피디아를 방문해 보세요. 

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


간단히 파일 디스크립터에 대해서 설명해 보도록 할께요.


정의 : 컴퓨터 프로그래밍에서 파일디스크립터란 파일에 접근하기 위해 추상화 시켜놓은 장치를 이야기 합니다.

윈도우의 핸들과 유닉스(리눅스)계열의 파일디스크립터는 같은 의미로 보시면 됩니다.

리눅스는 모든 장치를 파일로 관리 하기 때문에 파일디스크립터를 이용하여 장치에 접근 할 수 있게 (핸들링할수있게) 됩니다.


유닉스(리눅스) 계열의 시스템에서 열린파일(디바이스 장치)을 구분하는 단위이기도 합니다.

다시한번 강조하지만 일반파일 뿐만아니라 모든 외부장치도 파일로 취급한다고 했습니다. 기억하세요.


커널은 프로세스 단위로 열린파일 목록 (open()을 통해 파일 즉, 일반 파일및 모든 장치 를 열게 되면 디스크립터 번호가 부여되고 이것이

테이블로 관리됨) 을 담아 둘 수 있는 테이블을 관리하는데, 파일 디스크립터가 이 테이블에 등록되어 관리되고 있습니다.


테이블에 새로운 디스크립터를 등록하게 되면 파일디스크립터는 0부터 순차적으로 1만큼 자동으로 등록 되게 됩니다.

윈도우의 핸들과 개념은 거의 같다고 봐도 무방하지만 순차 등록되지 않는다는 차이점을 가지고 있습니다.


그럼 프로세스를 실행할 대 open함수를 통해 파일을 하나 열었다고 생각해 봅시다. 그 파일의 파일디스크립터는 0번일까요?

답은 아니오 입니다. '0', '1', '2' 의 번호는 이미 예약되어 있기 때문입니다.


'0' -> 표준입력 : 키보드

'1' -> 표준출력 : 모니터

'2' -> 표준에러 : 모니터


3번부터 번호를 부여 받겠네요. ( 일반적인 경우입니다. 간혹 필요에 의해 표준 1번이 close된 상태라면 1번을 부여 받겠죠 비어있으니까요..)


프로세서가 생성되면 개별적으로 파일디스크립터 테이블을 갖게 됩니다.

일반적으로 쉘(shell)에서 새로 실행한 프로세스가 모두 0~2가 예약되어 있으며,

어떤 프로세스에 파일 디스크립터 수가 늘어나도 새로 시작된 다른 프로세스도 모두 0~2만 사용된다는 것은 

프로세스마다 개별적으로 디스크립터 테이블을 가지고 있다는 것과 쉘에서 시작한 프로세스는 1번 프로세스(PID 1번)이자 

모든 프로세스의 부모 프로세스인 'init' 프로세스에서 fork()를 통해 파일 테이블이 복사된 것이라 추측할 수 있게 됩니다.


자신이 개발하는 프로세스에 파일 디스크립터를 추가하고, fork()를 통해 자식 프로세스를 생성하면 부모의 파일 디스크립터가 그대로

복사되는 것을 알 수 있고, 이를 통해 부모, 자식 프로세스간 IPC(PIPE나 socket으로 프로세스간 통신)을 구현 할 수 있으면

이를 통해 부모, 자식 프로세스간 파일 디스크립터를 복사 및 공유 가능한 사실도 알 수 있게됩니다.


파일 디스크립터는 일반적인 고수준 API가 아닌 저수준 API라 할 수 있는 시스템 콜에 주로 사용되며, 파일 디스크립터 생성시 '0'부터 

시작하는 만큼 '-1'은 오류가 있을 의미하게 됩니다.

'OS > 리눅스 & 유닉스' 카테고리의 다른 글

htonl() htons() ntohl() ntohs()  (0) 2011.12.28
socketpair  (0) 2011.12.27
perror  (0) 2011.12.23
write  (0) 2011.12.23
read  (0) 2011.12.23
: