노무현 대통령 배너


2006. 7. 20. 14:17

[본문스크랩] Buffer에 대해서 생각해 봅시다...

오랜만에여유가 있어 몇자적어 보고자 합니다...^^

그다지 표현이 자연스럽지 않을 것 같기도 한데요.

이유야 간단하죠 저도 거기 까지 밖에 모르는 거니까요..

잘 하시는 분이 더 좋을 글 달아 주시길 바랍니다.

한동안 fflush다 queue, buffer에 대해서 재밌는 얘기들이 많이 오간것 같네요..

제가 시간이 있었으면 아는데 까지라도 적고 싶었는데...... --;

아무래도 그냥 넘어가기 뭐해서 몇 가지 buffer 함수와 동작을 보고

fflush에 대하여 좀 오해의 소지가 있는 글들이 있어 다시 살펴보는 것도 괜찮을 것 같네요.

그리고 입/출력버퍼에 대해서는 입력큐,출력큐 란 말로 바꿔 말하지 않았으면 하는데요.

버퍼는 메모립니다. 큐는 자료구조이구요. 틀리다면 저도 따르도록 하죠.

우선프로그램 하나 보면서 결과를 생각해보죠, 그리고 컴파일 해서 결과를 봅시다.

#include
#include

void wait(int sec);

int main(void)
{
char bufStdout[BUFSIZ];
/* BUFSIZ 만큼 Buffer를 setting*/

setbuf(stdout, bufStdout); /* stdout을Buffer 받을 Stream으로 설정하고

bufStdout에 기억시킴 */

printf("ABCn"); /*ABC를 출력하려 하지만stdout이Buffer로 들어가기

때문에 바로 화면에 나타나지 않고 wait 함수에 의해

5초간 대기함.*/
wait(5);

fflush(stdout);/* stdout stream을 flush 하고
wait 함수에 의해

5초간 대기함.*/

wait(5);

return 0;
}

void wait(int sec)
{
clock_t start_time=clock();
while((int)((clock()-start_time)/CLOCKS_PER_SEC)}

동작이 재밌지 않나요. printf를 했는데도 바로 출력을 하지 않는거요.

버퍼에다가 꾹 담아놓았다가 풀어 버리니까 출력이 되죠.

이런게 버퍼죠. 인쇄할때도 버퍼에다 꾹꾹 담아놓고 보내는 거니까요.

그게 보통 말하는 spool이겠죠.

만약에 버퍼같은 queue 구조가 아닌 stack 구조면 어떨까요. 결과는 ?

wait 함수는 설명하지 않겠습니다.

위에서 좀 낯설다 싶은 것이 BUFSIZ , setbuf, fflush 일겁니다.

BUFSIZ는 stdio에 #define BUFSIZ 512 /* 범용상수 입니다. ≥256 */

setbuf는 stdio에 void setbuf(FILE *stream, char *buf); 로 정의 되어 있습니다.

기능은 버퍼를 설정합니다. *stream에 연결시키고 출력이나 입력이 실행되기 전에

사용됩니다. 버퍼 buf 가 NULL 인 경우는 입출력을 버퍼링 하지 않습니다.

setvbuf 와 다른 점은 리턴값 없다는 것이구요. setvbuf 에서 v는 value를 나타냅니다.

형식과 사이즈를 정할 수 있습니다.

그리고 fflush 는 int fflush(FILE *stream); 로 정의 되어 있습니다.

flush 라는 말뜻 그대로 지정된 stream을 날려버린다..-- 비운다는 말이 맞을지도.

fflush는 몇가지 주의 사항이 있습니다. 제가 가지고 있는 학술지에 보니 이렇게 써있네요.

1. 스트림 *stream이 출력 및 갱신 모드에서 직전에 행한 조작이 입력이 아닌 경우의

플러시 동작은 버퍼 내에 남아 있는 모든 데이타를 화일에 출력하기 위하여 호스트

환경으로 보내는 것이다.

2. 입력이나 갱신 모드에서 직전의 조작이 출력이 아닌 경우의 스트림 동작은 정의 되어

있지 않다. 예를 들면, 구현에 따라서는 ungetc 함수의 조작을 취소하는 경우도 있다.

위 코드에서 fflush 를 하지 않아도 출력은 됩니다. 단, 출력 버퍼를 비우는 역할을 할 뿐입니다. c++ 에서는 cout << "xxx"<< endl;하면 xxx를 ostream을 통해 출력버퍼로 보내고

endl에서 EOF와 flush 되는 동작을 함께 하는 것으로 알고 있습니다. 요즘 c compiler도 같

은 것 아닐까 싶네요. 그래서 flush를 하든 말든 나오는 건 아닐지... 음 추측은 금물이죠..

engineer는 탐구해서 원인을 찾아내야겠죠. 그런데 저도 여기까지 입니다.. ^^;

'프로그래밍 > C/C++' 카테고리의 다른 글

volatile의 사용  (0) 2007.04.20
[응용] printf를 잘 쓰자  (0) 2006.08.10
[본문스크랩] 함수 포인터란?  (0) 2006.07.20
[본문스크랩] const 포인터  (0) 2006.07.20
[본문스크랩] extern 과 static 의미?  (0) 2006.07.20