반응형

버퍼?

 

김X삼의 만화 버퍼 

가 아니라 컴퓨터에 사용되는 버퍼입니다. 

우리가 지금까지 사용했던 표준 입출력 함수는 모두 버퍼를 제공받습니다. 

여기서 버퍼란, 임시 저장 공간인데.  

입력장치인 키보드에서 데이터가 입력되어 프로그램까지 오는동안, 또한 

실행되고있는 프로그램에서 출력장치인 모니터까지 데이터가 가는동안, 

이 두가지 경우 모두 중간에 버퍼를 거치게 됩니다

 

 

그래서 출력, 입력을 하는 경우 데이터가 버퍼에 오자마자 바로바로 보내는 것이 아니라  

데이터를 버퍼에 임시 저장해 놓았다가, 적정량이 모이면 한꺼번에 전송합니다. 

이것이 바로 우리가 동영상을 재생할때 짜증을 유발하게 했던 "버퍼링(Buffering)"입니다. 

 

 

그렇다면, 이런 버퍼링은 왜 하는걸까요?  

시스템에서 입력과 출력은 중요도가 낮은 작업들입니다. 

그에 비해서 많은 노력이 들어가는 일들이죠 (정말 비효율적이군요) 

그래서, 입출력을 지금당장 처리할 필요가 없다면, 어느정도 버퍼에 쌓아놨다가 한꺼번에 

처리하는 것 (즉 버퍼링) 이 더 효율적이게 됩니다. 

그래서 버퍼링은 사용하는 것입니다. 

 

 

버퍼와 관련된 함수 fflush함수 

그런데, 가끔 입출력 과정에서도 긴급을 요하는 경우가 있습니다.(즉시 처리해야할 경우)  

그때 사용하는 함수가 fflush함수입니다. 

일단 함수의 기본 생김새를 살펴보겠습니다. 

 

 

 

이 fflush 함수의 인자 종류에 따라서 기능이 바뀝니다. 

인자로 입력 스트림이 전달되면 입력 버퍼안에 있는 데이터를 모두 삭제하게 됩니다. 

반대로 출력 스트림이 전달되면, 출력 버퍼안에 있는 데이터를 즉시 출력합니다. 

 

말로 백날 설명하는것보다 예를 하나 드는것이 좋겠습니다. 

 

일단 실행결과부터 보여드리겠습니다.

 

 

원래 이 프로그램은, 주민번호와 이름을 입력받게 프로그래밍 해놨는데

실행시켜보니 이름은 입력받을 기회조차 없는것을 볼 수 있습니다.

 

위의 코드를 잘 보시면

9번째줄에서 fgets 함수를 이용하여 데이터 입력을 받습니다.

실제 입력된 데이터는 901234-1234567 이며 저장하는 곳은 perID라는 이름의 변수입니다.

근데 이 변수는 크기가 7이므로, 널문자를 제외한 6글자가 perID에 저장되어

실제 저장되는 901234를 제외한 나머지 -1234567은 입력버퍼에 그대로 남게 됩니다.

그리고 다음에 14번째줄에서 다시 fgets함수가 호출되면,

키보드에서 입력을 받는 것이 아니라,

입력버퍼에 남아있는 값들을 입력값으로 받아들이게 됩니다.

그래서 위와같은 결과가 나왔습니다.

11번째줄의 주석처리를 없에고 실행해보겠습니다.

 

 

다음과같은 코드의 실행결과입니다. 

 

정상적으로 실행되는 것을 볼 수 있습니다. 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기