fputs : 표준 라이브러리 버퍼에 관해서 질문입니다..
글쓴이: 1 / 작성시간: 수, 2004/06/30 - 12:00오전
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 을 친 순간 쏟아져 나오는 수많은 영어문장들에 경악한...ㅠ.ㅠ..
모르는게 많은 초보로서 신기한것 투성이네요
바쁘시겠지만 꼭좀 도와주시면 감사하겠습니다..
Forums:
대개 new line이 있으면 바로 flush됩니다만, 그렇지 않은 경우
대개 new line이 있으면 바로 flush됩니다만, 그렇지 않은 경우는 buffer 비우는 것이 어느정도 차야됩니다. 그것은 정의되지 않은 행동입니다.
stdout으로도 쓸 수 있는 것은, 하나의 socket을 dup2로 0,1에 할당하여 사용하기 때문입니다.
---
http://coolengineer.com
주제와는 전혀 관련 없는 이야기지만...아이디가 멋지시군요. :)
주제와는 전혀 관련 없는 이야기지만...
아이디가 멋지시군요. :)
1 ...
답변 감사드립니다
제가 책을 많이 못 보아서 그런지 모르겠으나.
가끔씩 이렇게 책에서 보기 힘든 내용을 말씀해 주시는 분들이
정말 감사하게 느껴지네요
좋은 하루 되시기를.. 바랍니다...
아 그리고 그 정의되지 않은 버퍼의 출력은 코드 내용에
종속되는 것이겠네요(짐작이지만)
시스템 상태에 따라서라든가 코드랑 상관없이 불규칙 하다면
별 특이한 현상이 다 발생할듯 ^^
그리고 아이디에 대한 의견 감사합니다 ^^ 좋은 하루 되세요
c library 구현 나름이겠지요.write 는 시스템 콜이고,
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를 해줍니다. 즐핵...
---
http://coolengineer.com
음....
보통 8k바이트가 넘으면 flush(); 되는 걸로 알고있습니다.
H/W가 컴퓨터의 심장이라면 S/W는 컴퓨터의 영혼이다!
댓글 달기