[질문]fopen에 관하여 질문있습니다
글쓴이: wildrunner / 작성시간: 일, 2004/08/01 - 2:54오후
fopen에 대한 질문이라기보다 프로그램 내부적인 구조에 대한 문제인데요
APUE 의 program 7.6에 다음과 같은 코드가 있습니다
#include <stdio.h> #define DATAFILE "datafile" FILE * open_data(void) { FILE *fp; if((fp = fopen(DATAFILE, "r")) == NULL) return NULL; return fp; }
main함수에서 open_data를 호출하면 fp가 제대로 리턴되는 건가요?
물론 fp는 포인터이기는 하지만 fopen이 open_data의 스택 프레임에
FILE구조체를 저장하고 있다면 open_data가 리턴시 FILE구조체에
접근할 수 있지만, 만약 open_data리턴시 바로 다음 함수를 호출해버리면
FILE구조체가 붕괴(?)되버리지 않나요?
물론 fopen이 FILE구조체를 저장할때 힙을 사용한다면 문제가 되지 않겠죠.
책보다가 머리속이 정리가 안되어서 질문 드려봅니다.
설명 부탁드립니다.
Forums:
Program 7.6 Incorrect usage of an automa
Program 7.6 Incorrect usage of an automatic variable.
끝까지 읽어보세요. 설명을 해놓았군요.
그리고 fopen은 static 영역에 파일포인터를 저장하지 않을까 싶습니다.
제가 생각할때fopen은 static영역에 저장할수 없을듯합니다...
제가 생각할때
fopen은 static영역에 저장할수 없을듯합니다...........
동적으로 어떻게 static 영역에 저장할수 있나요?
(그런 함수나 문법이 없는 것 같은데..............)
static 영역은 프로그램 로딩시 결정되어 버릴텐데요
동적으로 할당될수 있다면 static 영역이라고 볼수 없죠
그리고 힙영역에 생성되는 것이 맞을 것 같습니다.
FILE*fp = fopen(...);
이 때 파일 구조체가 힙에 생성되어 fp는 힙을 가리키고
따라서 함수 리턴해도 문제가 없습니다.
리눅스에서................
저 함수를 두번호출하면 힙영역에 두개의 FILE구조체가 생성됩니다.
그리고......두개의 FILE 구조체 내부에는 서로 다른 파일 디스크립터가
저장될테고(fileno(FILE *fp)로 찍어보세요)
각각의 디스크립터는
서로 다른 커널영역 파일 참조 구조체(struct file) 를 참조할 것이고
이 두개의 struct file 구조체는 하나의 (같은)inode 구조체를 참조하게 됩니다.
댓글 달기