DIR, __dirstream data type 에 대해서 질문 있습니다.

avimimus의 이미지

/usr/include/dirent.h 파일을 보면,
DIR 이라는 type 에 대해서 정의되어 있는데, 다음과 같습니다.

Quote:
/* This is the data type of directory stream objects.
The actual structure is opaque to users. */
typedef struct __dirstream DIR;

그런데 위에 opaque라고 써 있듯이, __dirstream 이라는 structure는
사용자에게 안 보이도록 되어 있는 것 같더군요..
그러면 도대체 __dirstream structure의 정체는 무엇인거죠??
또 왜 그렇게 안 보이게 해 놓은 것인지 궁금합니다..

한가지 더 질문을 드리자면요,
구글에서 검색을 하다 보니, 어떤 mailing list에서 다음과 같은 답변을 보게 되었는데요,

Quote:
> I cannot find the definition of struct __dirstream anywhere to find out
> how to repair the old broken code. The comments in dirent.h indicate the
> underlying structure is opaque; so far it certainly has been to me. Any
> help is appreciated.

Opaque means exactly that -- you can't peek inside. More of the
structures in libc should be that way as it increases the chances
of binary compatibility.

You want to be using the function dirfd() to get at that value.

어째서 이렇게 __dirstream 을 못 보게 하는 것이 binary compatibility chance를 증가시킨다는 것인지 잘 모르겠습니다..

좀 알려 주시면 감사하겠습니다~
ps) 참고로, glibc-2.3.2-27.9.7 입니다.

redbaron의 이미지

잘 알지 못하다..들은 "가라"로 끼워 마춰보면..

Infomation Hiding 개념에 가까운게 아닐런지요..(캡슐화라고 해야 할까요..)

예를들어 모든 file stream을 알 필요가 없듯이.. __dirstream 은 디렉토리 구조를 Hack 하려고 하지 않는 이상 구지 알 필요가 없는 것 아닐까요?

ps) glibc 버젼과는 상관없는 문제인듯 합니다.

progcom의 이미지

avimimus wrote:
어째서 이렇게 __dirstream 을 못 보게 하는 것이 binary compatibility chance를 증가시킨다는 것인지 잘 모르겠습니다..

서로 다른 OS, 서로 다른 파일시스템에서 __dirstream은 다른 형태를 가질 수 있게 해준다는 것이지요. 어떤 파일시스템에서는 __dirstream을 A 형태로 가지는게 최적이고, 어떤 파일시스템은 __dirstream을 B 형태로 가지는게 최적일 수 있습니다.

사용자가 직접 __dirstream을 조작하려면 각각의 OS 및 파일시스템을 전부 고려해서 설계해야겠지요. 아예 안보이게 해두고, 조작용 함수를 따로 제공하면 소스 차원에서 호환성이 증가하는 것입니다 :) (나머지는 libc에 맡기면 됩니다)

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.