c언어 printf()에 관한 질문입니다^^;
글쓴이: seonghoons / 작성시간: 목, 2009/08/20 - 5:57오후
#include <stdio.h> int main() { int i = 0; for (i=0; i<10; i++) { printf("%d", i); sleep(1); } return 0; }
소스코드가 엄청 간단하죠^^; 그런데 궁금한점이 생겼습니다.
for문으로 printf()호출을 1초간격으로 10번 호출 하는데요
예상했던 결과는 1초에 한번씩 0부터 9까지 출력을 한다는 것이었습니다.
하지만 실행결과 10초동안 화면에 출력이 없다가 10초후에 0~9까지 한방에
출력되더군요...
#include <stdio.h> int main() { int i = 0; for (i=0; i<10; i++) { printf("%d\n", i); // printf() 문자열에 \n 추가... sleep(1); } return 0; }
위의 코드로 실행해 봤더니 1초에 한번씩 예상했던 결과가 나오네요..
\n 이 라인을 바꿔주는 것말고 표준출력스트림을 비우는 역할도 하는 것인지 궁금합니다.
\n말고 \r , 이나 \t 로도 해봤는데 다른 것들은 10초 기다렸다가 출력해주네요^^;
설명 좀 해주실 분 계신가용??^^
Forums:
_
스트림에 들어오는 데이터를 바로바로 쓰는 것보다 어느 정도 모아서 쓰는 게 효율이 높기 때문에, printf 등의 C 스트림 관련 함수에서는 버퍼링 구조를 가지고 있습니다. (그래서 write()같이 버퍼링이 없는 저수준 함수와 printf를 섞어 쓰면 희한한 결과가 나오기도 합니다.)
물론 바로바로 출력해줘야 할 경우도 있는데, 이 때는 fflush()를 이용해 주시면 됩니다.
fully buffer
버퍼 구조는 3가지가 있습니다
fully buffer, line buffer, unbuffer
표준입출력 stdio와 stdout은 fully buffer이고, 표준에러 stderr는 unbuffer 입니다
시스템콜은 user모드에서 kernel모드로 바꿔서 실행해주는 것인데, 이게 오버헤드가 있기 때문에 최대한 적게 실행되도록 해주게 되어 있습니다.
printf는 시스템콜 함수인 write함수를 최대한 적게 사용하기 위해서 fully 버퍼를 사용합니다.
setbuf()나 setvbuf() 함수를 사용해서 버퍼 모드를 변경할 수도 있습니다.
답변 감사합니다^^
많은 도움이 되었습니다~^^
댓글 달기