파일은 열려있으나 스트림은 없는 경우(파이프나 네트워크통신 채널을 생성하는 함수와 관련있는 것 같네요...)

inviolable의 이미지

Unix 고급 프로그래밍 제2판(번역자 류광, 원서 Advanced Programming in the UNIX environment) 165페이지 fdopen함수에 대한 설명에서요.

3. fdopen 함수는 기존 파일 서술자(open이나 dup,dup2,fcnl,pipe,socket,socketpair,accept 함수로 얻은)를 받아서 그 서술자에 표준 I/O 스트림을 연관 시킨다. 이 함수는 파이프나 네트워크 통신 채널을 생성하는 함수들이 돌려준 서술자를 스트림에 연관시키는 용도로 자주 쓰인다. 그런 특수한 종류의 파일들을 표준 I/O fopen함수로 열 수 없기 때문에, 해당 장치에 고유한 함수를 호출해서 파일 서술자를 얻은 후, fdopen을 이용해서 그것을 표준 I/O 스트림과 연관시켜야 한다.

그리고 조금 건너뛰어서 fdopen함수의 2번째 인수인 type에 대한 설명입니다.(fopen, freopen의 2번째 인수이기도 함 이 3함수는 모두 표준 I/O스트림을 여는데 사용됩니다.)

fdopen에서 type 인수는 의미가 조금 다르다. 이 함수는 이미 열린 파일에 대한 서술자를 받으므로, 스트림을 쓰기용으로 연다고 해도 파일이 절단되지는 않는다. (...조금 중략합니다.) 또한 표준 I/O 추가 모드로 파일을 생성하지는 못한다.(파일 서술자가 가리키고 있는 파일은 이미 존재하고 있는 것이므로).

요컨대 파일은 열려 있는데 스트림이 없다는 건인데 이것이 가능한것인지요... 159~160p에는 표준 I/O라이브러리에서 파일을 생성하거나 열면 파일 스트림을 얻게되는데, 이를 "스트림을 파일에 연관시켰다"라고 말한다. 라고 씌여있는데 이 설명과 배치되는 내용이 아닌가요??

속시원한 해결 부탁드립니다.

freemckang의 이미지

공부를 열심히 하시는 학생분이신가보네요.. ^^;; 올리신 질문들을 종합해보면.. 표준 I/O "라이브러리" 함수와 표준 I/O 함수 (저수준? 파일 입출력 함수라고도 하고 syscall이라고도 하고... 명칭은 여러가지가 있을 것 같네요 ^^)를 약간 섞어서 생각하시는 것이 아닌지 싶습니다.

저수준 파일 입출력 함수에는 스트림이라는 개념이 존재하지 않습니다. 스트림이라는 것은 표준 I/O "라이브러리" 함수 계열은 fxxx(3)에 해당하는 내용입니다.. (fsync(2)는 제외 ㅎㅎ)

쉽게 생각하면, open(2)에 user level buffer를 추가시킨 것을 fopen(3) 이라고 보시면 될 것 같습니다. 이 두가지 계열의 함수를 혼동하시면 안될 것 같네요 :)

句日新, 日新 日新 又日新.

inviolable의 이미지

바로 개념이 잡힌 것 같습니다. 답변 감사드립니다.

댓글 달기

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