fputs : 표준 라이브러리 버퍼에 관해서 질문입니다..

1의 이미지

fputs("input =>",stdout);
len_read = read(0, buf, MAXBUF);

if(write(sock, buf, len_read) != len_read)
error_handling("client error : write()-2");

로 문장을 받고자 하였습니다.

그런데 두 문장의 중간에

fflush();

를 사용하지 않고는 위의 fputs보다 read가 먼저 수행이 되더군요..

표준 라이브러리 함수들이 자체 버퍼를 가지고 있다지만 어느 시점에

데이터들이 빠져 나오는지를 제가 몰라서 이렇게 헤메는것인지?

왜 버퍼에서 빠져 나오지 않는것인지?

이유를 모르겠네요...

그리고 위의 read의 디스크립터를 1로 넣었었는데(실수로)

같은 결과가 (read가 먼저 수행되는 것이 아니라 최종 결과가)

나오더군요. 시스템 함수는 버퍼가없는 것으로 아는데

아마도 화면에 출력된 내용도 읽어 오나 보군요...

(참고로 최종 결과란, 서버로 메세지 전송후(위의 마지막 write)

서버에서 출력할 뿐입니다.)

man stdout 을 친 순간 쏟아져 나오는 수많은 영어문장들에 경악한...ㅠ.ㅠ..

모르는게 많은 초보로서 신기한것 투성이네요

바쁘시겠지만 꼭좀 도와주시면 감사하겠습니다..

pynoos의 이미지

대개 new line이 있으면 바로 flush됩니다만, 그렇지 않은 경우는 buffer 비우는 것이 어느정도 차야됩니다. 그것은 정의되지 않은 행동입니다.

stdout으로도 쓸 수 있는 것은, 하나의 socket을 dup2로 0,1에 할당하여 사용하기 때문입니다.

버려진의 이미지

주제와는 전혀 관련 없는 이야기지만...

아이디가 멋지시군요. :)

1 ...

1의 이미지

제가 책을 많이 못 보아서 그런지 모르겠으나.

가끔씩 이렇게 책에서 보기 힘든 내용을 말씀해 주시는 분들이

정말 감사하게 느껴지네요

좋은 하루 되시기를.. 바랍니다...

아 그리고 그 정의되지 않은 버퍼의 출력은 코드 내용에

종속되는 것이겠네요(짐작이지만)

시스템 상태에 따라서라든가 코드랑 상관없이 불규칙 하다면

별 특이한 현상이 다 발생할듯 ^^

그리고 아이디에 대한 의견 감사합니다 ^^ 좋은 하루 되세요

pynoos의 이미지

c library 구현 나름이겠지요.

write 는 시스템 콜이고, fwrite 는 c library 함수로서, 둘다 물론 /lib/libc.so.6에 들어 있지만,
하나는 바로 커널 호출로 이어지기 때문에 시스템 콜이라하고와 다른 녀석은 주된 기능이 libc.so.6에 들어 있어서 c library 함수라 부릅니다.

이 c library는 user level 에서 돌아가고, system call은 kernel level에서 돌아갑니다.

작성하신 프로그램을

strace ./a.out
ltrace ./a.out

등으로 실행해보세요. 전자는 system call trace, 후자는 library call trace를 해줍니다. 즐핵...

불량청년의 이미지

pynoos wrote:
그렇지 않은 경우는 buffer 비우는 것이 어느정도 차야됩니다.

보통 8k바이트가 넘으면 flush(); 되는 걸로 알고있습니다.

H/W가 컴퓨터의 심장이라면 S/W는 컴퓨터의 영혼이다!

댓글 달기

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