SETBUF(3)

이름
setbuf, setbuffer, setlinebuf, setvbuf - 스트림 버퍼링 작동들

사용법
#include <stdio.h>

void setbuf(FILE *stream, char *buf);
void setbuffer(FILE *stream, char *buf, size_tsize);
void setlinebuf(FILE *stream);
int setvbuf(FILE *stream, char *buf, int mode , size_t size);

설명
이용할수 있는 버리핑의 3가지 타입은 비 버퍼링, 블럭 버퍼링 그리고 라인 버퍼링이다. 출력 스트림이 비 버퍼링일때, 정보는 쓰자마자 목적 파일이나 터미널에 나타난다.; 블럭 버퍼링일때 많은 문자들은 블럭으로써 저장되고 쓰여진다; 라인 버퍼링일때 문자들은 뉴라인이 출력될때까지나 터미널 장치(stdin)에 부착된 스트림에서 입력이 읽혀질때까지 저장된다. 함수 fflush(3)는 블럭을 지우도록 강요할때 쓰여진다.( fclose(3)를 참조해라.) 보통 모든 파일들은 블럭 버퍼링이다. 처음 I/O 작동들이 파일에서 일어날때, malloc(3)이 불려진다. 그리고 버퍼를 얻는다. 만일 스트림이 터미널에 연계되어 있다면(보통 stdout 처럼), 스트림은 라인 버퍼링이다. 표준 에러 스트림 stderr 는 항상 기본적으로 비 버퍼링이다.

setvbuf 함수는 버퍼링을 바꾸기 위해 어떤때든지 열려진 스트림에 사용될수 있다. mode 인자는 다음 세 매크로중 하나이어야 한다:

    _IONBF
        비 버퍼링

    _IOLBF
        라인 버퍼링

    _IOFBF
        완전히 버퍼링

비-버퍼링 파일들을 제외하고, buf 인자는 적어도 size 바이트 만큼 긴 버퍼를 가리켜야 한다.; 이 버퍼는 현재 버퍼 대신 사용된다. 만일 인자 buf 가 NULL이라면, 단지 모드만이 영향을 받는다; 새로운 버퍼는 다음 읽고 쓰기 작동시 할당된다. setvbuf 함수는 어떤때든지 사용가능하지만 ``active''가 아닐때는 스트림의 모드만 바꿀수 있다: 즉, 어떤 I/O 전이나 fflush호출 바로 후에.

다른 세 함수는 setvbuf호출을 위한 별칭이다. setbuf 함수는 정확시 다음 호출과 같다.

    setvbuf(stream, buf, buf ? _IOFBF : _IONBF, BUFSIZ);

setbuffer 함수는 버퍼의 크기가 기본값 BUFSIZ 로 결정되는것 보다는 호출자까지라는 것을 제외하고는 같다. setlinebuf 함수는 정확히 다음과 같다:

    setvbuf(stream, (char *)NULL, _IOLBF, 0);

관련 항목
fopen(3), fclose(3), fflush(3), fread(3), malloc(3), puts(3), printf(3)

표준
setbuf 와 setvbuf 함수는 ANSI C3.159-1989 (``ANSI C'')에 따른다.

버그
setbuffer 와 setlinebuf 함수는 4.2BSD 이전버전에는 호환되지 않는다. 그리고 Linux에서는 이용할수 없다. 4.2BSD와 4.3BSD 시스템에서, setbuf 는 항상 suboptimal 버퍼 사이즈를 사용해야 하며 피해져야 한다.

여러분은 buf 와 그것이 가리키는 공간은 stream 이 닫혀지는 시간에도, 프로그램 종료시에도 여전히 존재하는 곳임을 확실히 해야 한다.

예를 들어, 다음은 불법적이다:

#include <stdio.h>
int main()
{
    char buf[BUFSIZ];
    setbuf(stdin, buf);
    printf("Hello, world!\n");
    return 0;
}

역자
정강훈 <skyeyes@soback.kornet.net>, 2001년 2월 26일