setvbuf(3)

#include <stdio.h>

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

stream의 buffering하는 방식과 buffering할 buffer를 지정합니다. buffering 방식은 3가지 방식이 있습니다.

   - 버퍼 미사용

   - 행단위 버퍼

   - 블럭 버퍼 (mode 참고)

 

system call file I/O와 달리 FILE *를 이용한 file I/O는 중간 buffer를 두어 system call 횟수를 줄여 시스템의 resource를 효율적으로 사용합니다. 그 buffering 방식을 설정하는 함수입니다.

 

 

파라미터

stream
    -  fopen(3), fdopen(3) 등으로 생성한 FILE *
buf
    -  mode가 _IOLBF 또는 _IOFBF로 설정되었을 때 사용할 메모리 buffer.

    NULL이면, 라이브러리에서 자동으로 malloc합니다.
    메모리 영역을 설정할 때에 local변수를 설정하였을 경우에는 그 함수를 벗어나기전에 
    반드시 fclose(3)를 호출하여야 합니다.

    그렇지 않으면, 전역변수나 malloc(3)으로 메모리 할당한 buf 변수를 사용합니다.
mode
    - mode는 stream의 동작 방식을 설정한다. 아래의 3가지 type으로 설정가능합니다.

_IONBF : 버퍼 미사용으로 설정합니다. 표준오류(stderr)가 대표적인 예입니다.
  stream I/O가 바로 kernel I/O로 연결됩니다.
  이 경우는 사실상 open(2)으로 파일을 open한 것과 비슷합니다.
  그렇지만,  fprintf(3), fgets(3) 등과 같이 다양한 함수를 사용할 수 있습니다.  
  buf, size 파라미터는 무시됩니다. (NULL로 설정)

_IOLBF : 행단위 버퍼로 설정합니다. 표준출력(stdout)이 대표적인 예입니다.
  즉, 데이터를 buffering하다가 개행문자를 만나면 kernel I/O를 합니다.
  buf 파라미터에 메모리를 할당할 수 있으며, 만약 NULL로 설정하면 내부적으로 자동으로 할당합니다.

_IOFBF : 블럭 버퍼로 설정합니다. 일반적으로 fopen(3)/fdopen(3)을 하면 기본적으로 설정되는 방식입니다.
  데이터가 블럭 버퍼크기만큼 읽기/쓰기가 수행되면 Kernel I/O를 수행합니다.
  buf 파라미터에 메모리를 할당할 수 있으며, 만약 NULL로 설정하면 내부적으로 자동으로 할당합니다.
size
    - 할당된 buf의 크기를 설정합니다. 
      될 수 있으면 최적화된 BUFSIZ를 사용하는 것이 좋습니다.

 

RETURN

0
    - 정상적으로 설정되었습니다.

0 이외의 값
    -  오류가 발생하였으며, 상세한 오류는 errno에 설정됩니다.

 


활용 예제

 

Sample : 로그 파일용은 _IOLBF로...

#include <stdio.h>
#include <string.h>
#include <errno.h>

int main(int argc, char *argv[])
{
    FILE *fp;
    int   file_size;

    if((fp = fopen("program.log", "a")) == NULL) {
        fprintf(stderr, "log file open error: %s\n", strerror(errno));
        return 1;
    }

    /* log file은 line buffer로 설정하는 것이 debug시 좋습니다. 
       로그를 출력하고 core 등으로 비정상적으로 프로그램이 종료했더라도 
       buffering된 로그파일은 라인단위로 로그가 생성됩니다.
    */

    setvbuf(fp, NULL, _IOLBF, BUFSIZ);

    ......

    fclose(fp);
}

 


see also :

    File 속성 정보 및 파일 관리 Library

    Directory 정보 조회 및 관리 Library

    System Call File I/O Library

    Stream File I/O Library

 

 

 

블로그 이미지

사용자 자연&사람

행복한 개발자 programmer since 1995.

댓글을 달아 주세요