file descriptor 의 원리.. fd_array
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 핸들로 특정 객체를 조작할 수 있는 프로그래밍 기법이 궁금합니다.. ^^..
혹시나.. 중복질문이면..검색어라도 추천해주시면 고맙겠습니다..
------------------------------------------------------------------------------------
바라미님 말씀처럼 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에 접근할 수 있게 되는 것입니다.
'Network' 카테고리의 다른 글
NestStat 명령어 (0) | 2009.07.21 |
---|---|
select (0) | 2008.08.17 |
IP 클래스 계산법에 대한 질문입니다...( (0) | 2007.06.12 |