[시스템] 12. I/O Redirection, Standard I/O Library
1. I/O Redirection 연산자
- $\verb|command > filename|$ : Redirecting stdout. (파일에 내용 덮어쓰기됨)
- $\verb|command >> filename|$ : Appending stdout. (파일에 내용 추가됨)
- $\verb|command 2> filename|$ : Redirecting stderr. (Error 메시지를 출력함)
- $\verb|command >& filename|$ : Redirecting stdout, stderr. (> 와 2> 가 합쳐진 형태)
2. Duplicating FD
$\verb|int dup(oldfd)|$
oldfd 가 가리키는 것과 같은 새로운 fd를 만든다. 이때 사용되지 않은 File Descriptor 중 가장 낮은 값을 가리킨다. 0~2번을 close하지 않는 이상 3번부터 create 하게 된다. (0은 stdin, 1은 stdout, 2는 stderr 으로 사용 상태이다.)
$\verb|int dup2(oldfd, newfd)|$
oldfd 에서 newfd로 대체한다. newfd가 열려있는 상태면 강제로 close 시키고 oldfd를 복사한다. 즉 newfd가 oldfd에 있던 파일을 가리키게 된다.
3. File Pointer
Standrd IO 가 제공해주는 File Descriptor와 같은 개념이다. $\verb|FILE|$ 타입으로 $\verb|<stdio.h>|$ 에 정의되어 있다.
4. fopen: Opening Files
$\verb|FILE *fopen(*path, *mode)|$
path에는 오픈할 파일 경로, mode에는 아래 6가지 모드 중 하나가 들어간다.
- "r": Read
- "r+": Read + Write (이미 존재하는 파일일 경우 기존 내용 삭제 X)
- "w": Write
- "w+": Read + Wrtie (이미 존재하는 파일일 경우 덮어쓰기)
- "a": Append
- "a+": Read + Write + Append
5. fdopen: Open via fd
$\verb|FILE *fdopen(fd, *mode)|$
기존에 존재하는 fd를 오픈할 때 사용한다. mode는 fd에서 작성한 모드와 똑같이 작성해야 한다.
6. fgetc, fgets, fread: Reading From a Stream
$\verb|int fgetc(FILE *stream)|$
스트림으로부터 하나의 character 를 read한다. 이때 int를 사용하지 않으면 EOF나 error를 저장하지 못하기 때문에 리턴값은 int로 받아야 한다.
$\verb|char *fgets(char *str, int size, FILE *stream)|$
스트림으로부터 (size - 1) 바이트를 read하여 str에 저장한다. 남은 1바이트에는 문자열의 끝을 나타내는 $\verb|\0|$ 이 저장된다. EOF나 개행문자를 만나면 reading이 종료된다. 리턴값은 str이다.
$\verb|size_t fread(void *buf, size, nr, FIILE *stream)|$
스트림으로부터 size 바이트의 데이터를 nr개 read하여 buf에 저장한다. (테이블 형태의 데이터 자료를 읽을때 사용) 리턴값은 read된 요소의 개수이다.
7. fputc, fputs, fwrite: Writing to a Stream
$\verb|int fputc(int c, FILE *stream)|$
하나의 문자 c를 받은 후 내부적으로 unsigned char 로 형변환하여 스트림에 저장한다.
$\verb|int fputs(*str, FILE *stream)|$
문자열을 스트림에 저장한다. str의 끝에 반드시 $\verb|\0|$ 을 명시해야 한다.
$\verb|size_t fwrite(void *buf, size, nr, FIILE *stream)|$
buf로부터 size 바이트의 데이터를 nr개 read하여 스트림에 저장한다. 리턴값은 write된 요소의 개수이다. (만약 리턴값이 nr보다 작을 경우 에러를 나타낸다.)
8. fflsuh, fseek, ftell, fclose, fcloseall
$\verb|int fflush(FILE *stream)|$
User Buffer 를 kernel에 작성한다. (버퍼링되고 있는 것을 강제로 업데이트하는 개념)
$\verb|int fseek(FILE *stream, long offset, int whence)|$
스트림의 File position을 offset 과 whence에 따라 변경한다. whence에는 이전에 lseek때 봤던 $\verb|SEEK_SET, SEEK_CUR, SEEK_END|$ 가 들어간다.
$\verb|long ftell(FILE *stream)|$
스트림의 현재 File position을 리턴한다.
$\verb|int fclose(FILE *stream)|$
스트림을 close한다.
$\verb|int fcloseall()|$
현재 프로세스와 관련된 모든 스트림을 닫는다. (stdin, stdout, stderr 까지 모두 포함)