인성 좋은 인성이

Linux - setvbuf() 함수 본문

IT공부/Linux

Linux - setvbuf() 함수

전인성 2019. 4. 10. 20:55

fputc(), putchar()

위 코드를 실행시키면, 실행결과는 2,3,4,5 newline 6,7,8,9,0 (으)로 나올 것이라 생각할 수도 있다. 

하지만 실제로 실행을 시키면 2,4,3,5 newline 6,8,0,7,9 (으)로 나온다. 왜 일까?

이미 눈치를 챘을 수도 있지만 코드를 보면 출력하는 함수가 두 종류이다. putchar fputc를 사용한다.

그렇다면 이 친구들의 역할이 어떻기에 이런 결과가 나올까?

 

putchar와 fputc는 표준 출력 함수이다. 이 둘의 차이점은 fputc는 파일로 출력한다는 것이고, putchar는 화면으로 출력한다. 자세히 살펴보면 putchar의 인자 값은 int c가 들어가고 fputc의 인자 값은 int ch, FILE *fp로 두 가지가 들어간다.

 

그렇다면 코드를 살펴보자. fputc는 인자 값으로 '8'과 stderr를 넣었다. 여기서 stderr는 표준 오류 출력이다. 따라서 컴파일러가 읽은 후 바로 화면에 바로 나오게 된다. 왜 먼저 나오는지 이해가 안 된다면 쉽게 생각해보자 상식적으로 ''오류가 발생했습니다"라는 메시지는 오류 발생 시점에서 나와야 한다. 그래야 사용자가 오류가 났다는 것을 인지할 수 있을 것이다. stderr는 그런 오류 메시지를 보여주는 것이기 때문에 바로 출력되는 것이다.

 

putchar는 인자 값으로 정수를 넣었다. 우선 이 친구들이 늦게 나온 이유를 알아보자. 그 이유로는 하드웨어의 자원은 한정적이다. 즉 우리가 무리하게 입출력을 하려고 하면 과부하가 걸리기 마련이다. 그래서 과부하를 방지하기 위해서 입출력하는 것들을 버퍼에 저장을 했다가 한 번에 출력하는 것이다. 따라서 putchar 했던 것이 빨리 나오지 않은 것은 버퍼에 저장되었었기 때문이다. 그렇다면 어느 시점에서 출력을 할까? 

기본적으로는 개행 문자를 만났을 때 출력한다. 그리고 프로그램이 종료되었다는 신호가 들어와도 출력한다.

 

setvbuf()

개발을 할 때 때로는 버퍼를 직접 설정해야 할 때가 온다. 그때 사용하는 함수가 setvbuf() 함수이다. 이 함수는 버퍼링 시스템을 변경한다.

setvbuf() 함수원형

함수 원형이다. 4가지의 인자 값이 들어감을 알 수 있다.

 

setvbuf() -> 버퍼링 시스템 변경 함수.

 

함수 원형

setvbuf(FILE *fstream, char *buf, int mode, size_t si

ze);

 

- *fstream : 파일의 주소를 가지고 있는 친구다. 0,1,2번은 지정되어 있다. (0 : 표준 입력, 1 : 표준 출력, 2 : 표준 에러 출력)

- *buf : 저장할 버퍼를 지정한다.

- mode : 어떤 모드를 사용할 것인지 정하는 곳이다. 모드는 3가지가 있으며 각각 _IONBF(널 버퍼) _IOLBF(라인 버퍼) _IOFBF(풀 버퍼)이다.

 

위 코드에서 arr라는 버퍼를 잡아줬고, 주석 처리돼있는 부분에 arr를 넣어줬다. 이렇게 버퍼를 직접 설정할 수 있다.