흐름 기반 I/O 는 다음 과 같은 세 가지 버퍼 를 제공 합 니 다: 전체 버퍼, 줄 버퍼, 무 버퍼

스 트림 기반 작업 은 최종 적 으로 read 나 write 함 수 를 호출 하여 I/O 작업 을 합 니 다.프로그램의 운행 효율 을 가장 높이 기 위해 흐름 대상 은 시스템 I/O 라 이브 러 리 함 수 를 호출 하 는 횟수 를 줄 이기 위해 버퍼 를 제공 합 니 다.
스 트림 기반 I/O 는 다음 세 가지 버퍼 를 제공 합 니 다.
전체 버퍼: 버퍼 가 채 워 질 때 까지 시스템 I/O 함 수 를 호출 합 니 다.읽 기 동작 에 있어 읽 은 내용 의 바이트 수가 버퍼 크기 나 파일 이 끝 날 때 까지 실제 I/O 작업 을 하고 외부 파일 내용 을 버퍼 에 읽 습 니 다.쓰기 작업 에 있어 서 버퍼 가 채 워 질 때 까지 실제 I/O 작업 을 하고 버퍼 내용 을 외부 저장 파일 에 기록 합 니 다.디스크 파일 은 보통 모든 버퍼 입 니 다.
줄 버퍼: 줄 바 꿈 문자 '를 만 날 때 까지 시스템 I/O 라 이브 러 리 함 수 를 호출 합 니 다.읽 기 동작 에 있어 서 줄 바 꿈 문자 '를 만 나 서 I/O 작업 을 하고 읽 은 내용 을 버퍼 에 읽 습 니 다.쓰기 동작 에 있어 서 줄 바 꿈 문자 '를 만 나 서 I/O 작업 을 하고 버퍼 내용 을 외부 저장 소 에 기록 합 니 다.버퍼 의 크기 가 제한 되 어 있 기 때문에 버퍼 가 가득 찼 을 때 줄 바 꿈 문자 '를 만 나 지 않 아 도 실제 I/O 작업 을 합 니 다.표준 입력 stdin 과 표준 출력 stdout 은 기본적으로 줄 버퍼 입 니 다.
버퍼 없 음: 버퍼 가 없 으 면 데 이 터 를 외부 파일 과 장치 에 즉시 읽 거나 출력 합 니 다.표준 오류 stderr 는 버퍼 가 없습니다. 이렇게 하면 오류 알림 과 출력 이 사용자 에 게 신속하게 피드백 되 어 오 류 를 제거 할 수 있 습 니 다.
상기 3 가지 버퍼 는 각각 3 개의 매크로 로 정의 되 는데 그 정 의 는 표 21 - 1 과 같다.
표 21 - 1 버퍼 형식의 매크로 정의
버퍼 종류
정 하 다 의리 의 거대 하 다.
풀 버퍼
_IO_FULL_BUF
행 버퍼
_IO_LINE_BUF
버퍼 없 음
_IO_UNBUFFERED
위 표 에서 말 한 버퍼 형식 매크로 를 사용 할 때 파일 흐름 대상 의 버퍼 표지 와 이 매크로 를 '와' 작업 을 해 야 합 니 다. 결과 가 0 인지 여 부 를 판단 하면 이 버퍼 파일 흐름 의 버퍼 가 이 형식 에 속 하 는 지 알 수 있 습 니 다.파일 흐름 을 가 져 오 는 버퍼 형식 을 보 여 줍 니 다.이 프로그램 은 표준 출력, 표준 입력, 표준 오류 3 개의 파일 설명자 의 버퍼 형식, 버퍼 크기 등 정 보 를 출력 합 니 다.
(1) vi 편집기 에서 이 프로그램 을 다음 과 같이 편집 합 니 다.
프로그램 목록 21 - 1 buf. c 출력 버퍼 의 종류 와 버퍼 크기
#include <stdio.h>
int main(void)

printf("stdin is ");
if(stdin->_flags & _IO_UNBUFFERED) 
printf("unbuffered
");
else if(stdin->_flags & _IO_LINE_BUF)
printf("line-buffered
");
else
printf("fully-buffered
");
printf("buffer size is %d
", stdin->_IO_buf_end - 
stdin->_IO_buf_base); 
printf("discriptor is %d

", fileno(stdin)); 

printf("stdout is ");
if(stdout->_flags & _IO_UNBUFFERED) 
printf("unbuffered
");
else if(stdout->_flags & _IO_LINE_BUF)
printf("line-buffered
");
else
printf("fully-buffered
");
printf("buffer size is %d
", stdout->_IO_buf_end - 
stdout->_IO_buf_base); 
printf("discriptor is %d

", fileno(stdout));

printf("stderr is ");
if(stderr->_flags & _IO_UNBUFFERED) 
printf("unbuffered
");
else if(stderr->_flags & _IO_LINE_BUF)
printf("line-buffered
");
else
printf("fully-buffered
");
printf("buffer size is %d
", stderr->_IO_buf_end - 
stderr->_IO_buf_base); 
printf("discriptor is %d

", fileno(stderr));
return 0;
}

(2) 셸 에서 이 프로그램 을 다음 과 같이 컴 파일 합 니 다.
$gcc buf.c -o buf

(3) 셸 에서 이 프로그램 을 다음 과 같이 실행 합 니 다.
$./buf
stdin is line-buffered
buffer size is 1024
discriptor is 0
stdout is line-buffered
buffer size is 1024
discriptor is 1
stderr is unbuffered
"buffer size is 0
discriptor is 2

(4) 재 설정 을 사용 한 후 이 프로그램 을 다음 과 같이 실행 합 니 다.
$./buf < in.txt 1> out.txt 2> err.txt
stdin is full-buffered
buffer size is 4096
discriptor is 0
stdout is full-buffered
buffer size is 4096
discriptor is 1
stderr is unbuffered
"buffer size is 0
discriptor is 2

설명: 이 를 통 해 알 수 있 듯 이 언제든지 표준 오류 가 발생 하면 버퍼 링 이 없다.
.이렇게 하면 오류 정 보 를 제때에 사용자 에 게 출력 하여 사용자 가 오 류 를 제거 하고 문 제 를 해결 하도록 보장 할 수 있다.

좋은 웹페이지 즐겨찾기