(linux) FILE 구조체는 어디에 정의되어 있나요

12monkeyz의 이미지

저수준 입출력 함수들을 사용하여서
표준입출력라이브러리 함수를 구현하려 합니다

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
입니다

12monkeyz의 이미지

_IO_FILE 이란 구조체가 있고
int _fileno 라는게 있어서 이게 왠지 file descriptor 인것같아서
사용해봤더니 맞네요--;

뭐 이런게다있나 싶네요

문정훈의 이미지

라이브러리 함수가 따로 있습니다. 시스템 헤더파일 뒤지는건 좀 힘드실 것 같구요. ^^

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);

참고 되셨길. ^^

12monkeyz의 이미지

이게 저수준 함수만 사용해서 구현하라는 조건에 위배되는듯싶어서요..

fileno() 저수준 입출력 함수인가요?

fdopen() 이것도 지금 fopen을 open으로 구현하기위해서 사용해야 할듯 싶은데

저수준 함수인지 아닌지의 구분을 못하겠네요

만약 fdopen을 사용하지 못한다면 fopen을 open으로 구현하는게 정말 힘들어지네요

open은 int형인 file descriptor 을 return 할텐데

이걸 FILE 구조체를 반환하는 fopen으로 만들려면..

아...

결론은 fileno() 와 fdopen()
이 두함수를 저수준 입출력 함수라고 할 수 있나요?

unipro의 이미지

간단하게 man을 사용하면 알 수 있습니다.

man 2 open 이라고 치면, 대략, open, close, create, read, write, fcntl 등이 시스템콜의 범주에 속함을 알 수 있습니다. (보통, 2번 카테고리는 시스템호출 함수들입니다.), 따라서 앞에 열거한 함수들이 저수준 입출력 함수들입니다. 몇개 더 있을 수 있겠지만, 어쨌든 이것만 사용해서 하면 조건을 만족시킬 수 있을 것입니다.

man fileno, man fdoepn 으로 두 함수를 확인하면 3번 목록임으로 시스템콜이 아니겠네요. 입출력함수 중에서 FILE 구조체를 사용한다면-파일 스트림을 이용한다면 표준 입출력 함수라고 생각하시면 됩니다.

내 블로그: http://unipro.tistory.com

cppig1995의 이미지

터보C에서는 stdio.h에

struct _iobuf { 어쩌구저쩌구 };
typedef _iobuf FILE;

이런 식으로 정의가 되어있습니다.

마찬가지로 (FILE이 typedef이므로) 다른 구현에서도 당연히 FILE이라는 '구조체'는 없습니다.
FILE은 '구조체에 대한 typedef'일 뿐이죠...

Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.