반응형
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 :
반응형
'C언어 header > stdio.h' 카테고리의 다른 글
rename(3) - 파일명 또는 디렉토리의 이름 변경 및 위치 변경 (0) | 2019.09.24 |
---|---|
remove(3) - 파일 또는 디렉토리를 삭제하는 함수 (0) | 2019.09.24 |
pclose(3) - 생성된 pipe stream을 close함. (0) | 2019.09.24 |
popen(3) - 프로세스로부터 pipe stream open (0) | 2019.09.24 |
fileno(3) - stream에 할당된 file descriptor얻기 (0) | 2019.09.24 |