[완료] file descriptor 의 원리..
글쓴이: 매그넘 / 작성시간: 일, 2007/10/14 - 4:59오후
int fd;
fd=open("test.txt", O_RDWR);
write( fd , buf , 1000 );
이런식으로.. 파일에 데이타를 기록하게 되는데..
write 를 어디에다 하게 될지를.. file descriptor 가 가리키는 파일에다 기록을 하게 되는데..
fd 가 단순한 int 인데 ( 처음 open 을 하면.. 3 이 리턴이 되죠..)
3 이라는 숫자가.. 어떻게 test.txt 파일과 매핑이 되는지 궁금합니다..
C 에서 어떻게 구현이 된건지..궁금하고...
fd 가 언어차원에서의 지원이 아니라.. 라이브러리 함수에서의 지원으로 알고 있는데..
제가.. 함수를 작성할때.. integer 핸들을 어떤 특정 객체를 가리키도록하고..
그 integer 핸들로 특정 객체를 조작할 수 있는 프로그래밍 기법이 궁금합니다.. ^^..
혹시나.. 중복질문이면..검색어라도 추천해주시면 고맙겠습니다..
Forums:
...
fd 는 언어나 라이브러리 차원이 아니라 시스템 차원에서 구현되어 있습니다.
리눅스를 보면 프로그램이 실행 된후 메모리에 올라간 메모리의 프로세스 Descriptor 에 보시면 fd 의 배열이 포함되어 있습니다.
open 같은 시스템 콜로 파일을 열게 되면 그 배열에 등록이 되고(물론 파일명이 아니라 다른 정보로 기록됩니다. 그건 저도 자세히 잘..)
위의 int 숫자는 그 배열의 첨자라고 생각하시면 됩니다.
이렇게 프로세스 모델에 fd들이 들어있고 그것들을 사용하여 파일 입출력을 하게 됩니다.
리눅스라면 다음
리눅스라면 다음 디렉토리를 참조하세요.
/proc/숫자/fd
----
Do not feed troll!
----
데스크탑 프로그래머를 꿈꾸는 임베디드 삽질러
fd는 array 의 index
바라미님 말씀처럼 fd는 해당 프로세스의 open file 을 관리하는 구조체 배열의 index 라고 생각하시면 됩니다.
그 구조체의 index 가 가리키는 객체가 dentry 라는 객체이고, 그 dentry 객체는 또다시 해당 파일을 나타내는 inode 객체를 가리키게 됩니다.
integer 값으로 특정 객체를 다루기를 원하시면 위와 유사한 방식으로 하시면 가능할 것 같군요.
좀더 자세한 내용은 아래와 같습니다.
커널 구조체중 struct files_struct 보시면 struct file fd_array 라는 배열이 있습니다.
실제로 open()을 통해 얻는 fd 는 저 구조체의 index 를 나타냅니다.
일반적으로 0, 1, 2 index 는 std-in/std-out/error 와 관련된 fd 로 미리 할당이되고, 보통 open()을 하게 되면 fd 값은 3이 됩니다.
3 번 index 로 test.txt 를 찾는 방법은
우선 fd_array[3] 이 pointing 하고 있는 file 구조체의 f_dentry 를 얻어오게됩니다. dentry 란 것은 directory entry 를 의미하는데, 리눅스에서 디렉토리에 접근을 빠르게 하기 위한 구조체로 사용하고 있습니다. open() 시스템 콜을 호출하게 되면, test.txt 가 존재하는 위치와 관련되어 dentry 구조체가 만들어집니다.
dentry 구조체는 관련된 inode 구조체를 가리키는 필드를 포함합니다. 리눅스에서 파일은 inode 로 표현된다는 것을 아시죠?
따라서 open("test.txt',...) 함수로 호출된 파일은 test.txt 에 대한 dentry 생성, inode 생성(또는 읽음) 후에 해당 프로세스의 open 파일 관리 구조체인 files_struct 의 fd_array 의 비어있는 위치에 test.txt 의 dentry 를 포인팅하고 그 index 인 3을 넘겨주는 것입니다.
이후 사용자가 3번을 가지고 시스템 콜을 수행하게되면, 해당 프로세스의 files_struct 의 fd_array index 를 통해서 관련 inode에 접근할 수 있게 되는 것입니다.
==========================
별은 바라보는 자에게 빛을 준다
자세한 설명
자세한 설명 감사드립니다!..
어떠한 구조인지 명쾌하게 이해가 되었습니다!
댓글 달기