본문 바로가기

학부 수업 정리/시스템프로그래밍 (21-2)

[시스템] 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

https://stackoverflow.com/questions/1466000/difference-between-modes-a-a-w-w-and-r-in-built-in-open-function

 

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 까지 모두 포함)