(linux) FILE 구조체는 어디에 정의되어 있나요
글쓴이: 12monkeyz / 작성시간: 수, 2006/10/25 - 5:18오후
저수준 입출력 함수들을 사용하여서
표준입출력라이브러리 함수를 구현하려 합니다
FILE 구조체 안에서 file descriptor 을 받아야 하는데
char _file // file descriptor
이런식으로 설명되어있는 책을 보고
대략 이런식으로 생각했습니다
FILE *fp 로 open된 화일을
나중에 fclose 대신 close 로 구현하려면
close(fp->_file) 이렇게 하면되겠다 싶었는데
_file 이라는 member가 없다고 에러가 나네요
그래서 stdio.h 에 FILE 구조체가 정의되어 있다길래 헤더화일 열어보아도
어디에도 FILE struct 가 정의되어있지가 않습니다(혹은 제가 못찾고있습니다)
결론은 FILE 구조체는 어디에 정의되어있는건가요?
그리고 FILE 구조체의 멤버중 filedescriptor이 있는게 아닌건가요?
(제가 생각하는게 개념적으로 틀린건가요?)
답변 부탁드려요
참ㄱ로
Linux version 2.4.21-32.0.1.ELsmp (bhcompile@bugs.build.redhat.com) (gcc version 3.2.3 20030502 (Red Hat Linux 3.2.3-52)) #1 SMP Tue May 17 17:52:23 EDT 2005
입니다
Forums:
libio.h 를 찾아보니까..
_IO_FILE 이란 구조체가 있고
int _fileno 라는게 있어서 이게 왠지 file descriptor 인것같아서
사용해봤더니 맞네요--;
뭐 이런게다있나 싶네요
FILE 스트럭처에서 fd 꺼내는 법
라이브러리 함수가 따로 있습니다. 시스템 헤더파일 뒤지는건 좀 힘드실 것 같구요. ^^
man 3 fileno 해보시면 나옵니다.
NAME
clearerr, feof, ferror, fileno - check and reset stream status
SYNOPSIS
#include <stdio.h>
void clearerr(FILE *stream);
int feof(FILE *stream);
int ferror(FILE *stream);
int fileno(FILE *stream);
참고 되셨길. ^^
fileno() 이것을 사용했었는데..
이게 저수준 함수만 사용해서 구현하라는 조건에 위배되는듯싶어서요..
fileno() 저수준 입출력 함수인가요?
fdopen() 이것도 지금 fopen을 open으로 구현하기위해서 사용해야 할듯 싶은데
저수준 함수인지 아닌지의 구분을 못하겠네요
만약 fdopen을 사용하지 못한다면 fopen을 open으로 구현하는게 정말 힘들어지네요
open은 int형인 file descriptor 을 return 할텐데
이걸 FILE 구조체를 반환하는 fopen으로 만들려면..
아...
결론은 fileno() 와 fdopen()
이 두함수를 저수준 입출력 함수라고 할 수 있나요?
간단하게 man을
간단하게 man을 사용하면 알 수 있습니다.
man 2 open 이라고 치면, 대략, open, close, create, read, write, fcntl 등이 시스템콜의 범주에 속함을 알 수 있습니다. (보통, 2번 카테고리는 시스템호출 함수들입니다.), 따라서 앞에 열거한 함수들이 저수준 입출력 함수들입니다. 몇개 더 있을 수 있겠지만, 어쨌든 이것만 사용해서 하면 조건을 만족시킬 수 있을 것입니다.
man fileno, man fdoepn 으로 두 함수를 확인하면 3번 목록임으로 시스템콜이 아니겠네요. 입출력함수 중에서 FILE 구조체를 사용한다면-파일 스트림을 이용한다면 표준 입출력 함수라고 생각하시면 됩니다.
내 블로그: http://unipro.tistory.com
터보C에서는
터보C에서는 stdio.h에
이런 식으로 정의가 되어있습니다.
마찬가지로 (FILE이 typedef이므로) 다른 구현에서도 당연히 FILE이라는 '구조체'는 없습니다.
FILE은 '구조체에 대한 typedef'일 뿐이죠...
Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.
댓글 달기