Standard I/O 라이브러리는 열린 파일을 starem으로 모델링한다.
프로그래머에게 stream은 FILE 유형의 구조에 대한 포인터이다.
모든 ANSI C프로그램은 stdin, stdout, stderr의 3가지 오픈 stream으로 시작한다.
#include <stdio.h>
extern FILE *stdin; /* standard input (descriptor 0) */
extern FILE *stdout; /* standard output (descriptor 1) */
extern FILE *stderr; /* standard error (descriptor 2) */
int main() {
fprintf(stdout, "Hello, world\n");
}
Buffred I/O : Motivation
- getc, putc, ungetc
- gets, fgets
프로그램은 위 함수들을 이용해서 문자를 하나씩 읽고 쓸 수 있다.
read, write는 커널을 호출해야 하기 때문에 비효율적이다.
Unix I/O vs. Standard I/O vs. RIO
Unix I/O 모델은 커널에 구현되어 있다. RIO와 Standard I/O 함수는 Unix I/O 함수 위에 구현된다.
RIO 함수는 자동으로 short count를 처리하고 텍스트 라인을 읽기 위한 효율적인 버퍼링 방식을 제공한다.
Standard I/O 함수는 printf, scanf와 같은 형식 있는 I/O 루틴을 포함하여 Unix I/O 함수의 대체 기능을 제공한다.
Pros and Cons of Unix I/O
Pros
- 가장 일반적이고 적은 오버헤드
- metadata을 접근하는 함수 제공
- async-signal safe
- 안전하게 signal handler에서 사용 가능
Cons
- short count를 다루는게 복잡하고 오류가 발생하기 쉬움
- 텍스트 라인을 효율적으로 읽으려면 버퍼링 형태가 필요하고 복잡하고 오류가 발생하기 쉬움
Pros and Cons of Standard I/O
Pros
- 버퍼링이 read, write 시스템 콜을 호출하는 횟수를 줄임으로써 효율성 증가
- short count가 자동으로 해결됨
Cons
- metadata에 대한 접근하는 함수를 제공하지 않음.
- async-signal-safe하지 않음.
- signal handler를 사용하는데 적절하지 않음.
- network socket에서 입력과 출력하는 데 사용하는 것은 적절하지 않음.