Hongfluenza

setvbuf 함수 본문

STUDY/SYSTEM

setvbuf 함수

Hongfluenza 2018. 4. 30. 21:43

setvbuf


#include <stdio.h>

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



설명


stream의 buffering하는 방식과 buffering을 할 buffer를 지정한다.

즉, 스트림 버퍼링 방식을 변경한다.



버퍼의 크기는 세 번째 인자에 바이트 수로 전달된다.


만일, 버퍼를 설정하지 않는다면 ( 즉, 두 번째 인자가 NULL이라면 ), 시스템을 동적으로, 함수에 의해 요청된 크기 만큼 메모리를 할당하게 되며 이를 스트림의 버퍼로 사용하게 된다.


mode 인자는 이 버퍼를 fully buffered, line buffered, unbuffered 로 할 지 결정한다.




1. fully buffered


읽기 작업은 스트림에 대응되는 장비에 바로 쓰여지지 않는다.


그 대신에 쓰여질 데이터는 버퍼에 잠시 저장되었다가 버퍼에 일정한 블록 이상 쌓이게 되면 그제서야 장비에 쓰여지게 된다.


한 블록이 다 채워지지 않았는데도 불구하고 스트림을 강제로 비움으로써 (flush) 장비에 쓸 수 있는데

 

이는 fflush 함수를 호출하거나 fclose 함수를 호출해 파일을 닫으면 된다. 참고적으로 모든 버퍼는 프로그램이 종료시 자동적으로 비워지게 된다.



2. line buffered 


버퍼에 개행 문자가 입력될 때마다 장비에 쓰여지게 된다.



3. unbuffered


데이터는 버퍼와 같은 중간 경유지를 거치지 않고 직접적으로 쓰여지게 된다. 즉, 쓰기 작업을 할 때 바로바로 쓰이게 된다.




인자


>> stream


fopen(3), fdopen(3) 등으로 생성한 FILE *

작업을 수행할 열린 스트림의 FILE 객체를 가리키는 포인터



>> buffer


mode가 _IOLBF 또는 _IOFBF로 설정되었을 때 사용할 메모리 buffer


유저가 할당한 버퍼로 최소한 1 바이트의 크기는 되야 한다.

만일 NULL로 설정하면 함수는 자동으로 지정한 크기의 버퍼를 할당하게 된다. ( 라이브러리에서 자동으로 malloc한다.)


메모리 영역을 설정할 때에 local 변수를 설정하였을 경우에는 그 함수를 벗어나기전에 반드시 fclose(3)를 호출하여야 한다.


그렇지 않으면, 전역변수나 malloc(3)으로 메모리 할당한 buf 변수를 사용한다.



>> mode



1. _IONBF


버퍼 미사용으로 설정


표준오류(stderr)가 대표적인 예이다.


stream I/O가 바로 kernel/O로 연결된다.



2. _IOLBF


행단위 버퍼로 설정한다. 표준출력(stdout)이 대표적인 예


즉, 데이터를 buffering하다가 개행문자를 만나면 kernel I/O 한다.


buf 파라미터에 메모리를 할당할 수 있으며, 만약 NULL로 설정하면 내부적으로 자동으로 할당한다.



3. _IOFBF


블럭 버퍼로 설정


데이터가 블럭 버퍼크기만큼 읽기/쓰기가 수행되면 kernel I/O를 수행한다.


buf 파라미터에 메모리를 할당할 수 있으며, 만약 NULL로 설정하면 내부적으로 자동으로 할당한다.



>> size


할당된 buf의 크기를 설정함


될 수 있으면 최적화된 BUFSIZE를 사용하는 것이 좋다.



리턴값


0 => 정상적으로 설정


0이 아님 => 오류가 발생하였으며, 상세한 오류는 errno에 설정됨

'STUDY > SYSTEM' 카테고리의 다른 글

8086 CPU 레지스터 구조  (0) 2019.08.11
[System] Intel과 AT&T 어셈블리어 문법  (0) 2018.04.09
함수 호출 규약(Calling Convention)  (0) 2018.04.09