[태그:] <span>_IONBF</span>

C언어 표준 라이브러리에서 제공하는 입출력 함수들은 평균적으로 성능이 높게 입출력할 수 있게 고안하여 입출력 시스템 호출에 관해 깊은 지식과 경험이 없는 이들도 충분히 높은 성능을 갖게 프로그래밍할 수 있습니다.

물론 C언어 표준 입출력 라이브러리에서는 개발자가 버퍼링 정책을 변경하거나 버퍼를 설정하는 몇 가지 함수를 제공하고 있습니다.

#include <stdio.h>

int setbuf(FILE *fstream, char *buf);

int setbuffer(FILE *fstream, char *buf,size_t size);

int setlinebuf(FILE *fstream);

int setvbuf(FILE *fstream, char *buf, int mode, size_t size);

mode:

_IONBF: NULL BUFFERING

_IOLBF: LINE BUFFERING

_IOFBF: FULL BUFFERING

setbuf 함수는 파일 스트림에 사용할 버퍼를 라이브러에서 지정한 버퍼를 사용하지 않고 개발자가 입력 인자로 전달한 버퍼를 사용하게 합니다. 그리고 setbuffer 함수에서는 버퍼의 크기를 변경하는 것이 가능합니다. setlinebuf 함수는 LINE BUFFRING으로 설정하며 setvbuf는 버퍼링 모드를 설정할 수 있습니다. 만약 buf를 NULL로 주면 버퍼링 정책만 변경합니다.

다음 소스 코드는 표준 출력의 버퍼링 정책을 NULL BUFFERING으로 설정한 후에 표준 출력 및 표준 에러에 출력하는 코드입니다. 표준 출력과 표준 에러에 출력하는 부분은 <5.1 버퍼링>에서 사용한 코드와 같습니다.

/***********************************************************************
* ex_change_buffering.c                                                        *
* example source – print string(print character and sleep)            *
***********************************************************************/

#include <stdio.h>
#include <unistd.h>
int main()
{
    setvbuf(stdout, NULL, _IONBF,0);

    putchar(‘e’);
    sleep(1);
    fputc(‘H’, stderr);

    putchar(‘h’);
    sleep(1); 
    fputc(‘e’, stderr);

    putchar(‘\n’);
    sleep(1); 
    fputc(‘l’, stderr);

    putchar(‘p’);
    sleep(1); 
    fputc(‘l’, stderr);

    putchar(‘u’);
    sleep(1); 
    fputc(‘o’, stderr);

    putchar(‘b’);
    sleep(1); 
    fputc(‘!’, stderr);

    putchar(‘\n’);
    sleep(1); 
    fputc(‘\n’, stderr);

    return 0;
}

여기에서는 표준 출력을 NULL BUFFERING으로 설정하였기 때문에 putchar 함수 호출하면 대기없이 콘솔 화면에 출력합니다. 물론 표준 에러는 원래 NULL BUFFERING이기 때문에 마찬가지로 fputc(문자,stderr) 함수 호출하면 대기없이 콘솔 화면에 출력합니다.

[그림 5.2] ex_change_buffering 실행 화면
[그림 5.2] ex_change_buffering 실행 화면

여러분이 작성하는 프로그램에서 어떠한 크기의 데이터를 어떠한 빈도로 출력하는지 등에 따라 버퍼의 크기와 버퍼링 정책을 설정하여 성능을 높일 수 있습니다.

리눅스 시스템 프로그래밍