High-Level File I/O(Buffered I/O)

  • C Standard library를 사용해서 파일 입출력 수행
  • File pointer 사용(ex. File* fp)
  • 버퍼 단위로 디스크에 입출력

※ 매 byte 마다 disk에 접근해서 write 하는 것은 비용이 큼 -> 메모리의 buffer에 데이터를 저장해서 한번에 disk에 접근

Physical disk address

  • Sector(물리적 데이터 전송 단위)를 지정

Logical disk address

  • Disk System의 데이터 전체를 block들의 나열로 취급
  • Block 번호 -> physical address 변환 모듈 필요 (disk driver)

Disk address mapping

OS(kernel) ----> Disk driver ----> Disk controller

                 Block#          Pysical Addr.

Block

  • 파일 시스템의 추상화 -> 운영체제 입장에서 file system은 block들의 나열
  • disk access의 최소 단위

Kernel buffer (Page cache)

  • Page write-back 시점
    • 커널의 메모리 공간이 부족할 때
    • 내용이 변경된 후, 일정 시간이 지나면
    • fsync() 호출 -> 강제 동기화
  • write-back 시점은 user 입장에서 예측하기 어려움

File pointer

  • File operation을 관리하는 구조체(FILE)를 가리키는 포인터
  • 내부적으로 file descriptor와 연동됨

Stream

  • 프로그램과 file을 연결한 통로
  • open : 파일 스트림 생성 및 FILE 구조체에 저장
  • close : 스트램 해제

fopen

#include <stdio.h>

FILE* fopen(const char* path, const char* mode);
  • path : 열려는 파일의 경로
  • mode : 파일 열기 모드
  • return : file pointer
    • NULL : fail to open

fclose

#include <stdio.h>

int fclose(FILE* stream);
  • stream : 닫으려는 stream
  • return
    • 0 : success
    • -1(EOF) : error

Example

#include <stdio.h>
#include <stdlib.h>

int main(void) {
        FILE* fp;

        if ((fp = fopen("hello.txt", "w")) == NULL)
        {
                perror("fopen: hello.txt");
                exit(1);
        }

        fclose(fp);

        return 0;
}

File access

Character IO

#include <stdio.h>

int fgetc(FILE* stream);
int getc(FILE* stream);
int getchar(void); // = getc(stdin) -> 키보드로부터 입력받음
  • stream : File operation을 수행할 stream
  • return : 읽은 문자 | EOF(-1) : error
#include <stdio.h>

int fputc(int c, FILE* stream);
int putc(int c, FILE* stream);
int putchar(int c); // = putc(c, stdout) -> 모니터에 출력
  • stream : File operation을 수행할 stream
  • c : 쓰려는 문자
  • return : 기록한 문자 | EOF(-1) : error

String IO

#include <stdio.h>

char* gets(char* s);
char* fgets(char* s, int n, FILE* stream);
  • s : 읽은 문자열을 저장할 buffer
  • n : buffer의 크기
  • stream : File operation을 수행할 stream
  • return : buffer의 시작 주소 | NULL : 읽을 것이 없음
#include <stdio.h>

int puts(char* s);
int fputs(char* s, FILE* stream);
  • s : 기록할 문자열을 저장한 buffer
  • stream : File operation을 수행할 stream
  • return
    • 양수 : success
    • 음수 : error

Binary IO

  • 파일을 열고 닫을 때 mode에 b를 추가
#incldue <stdio.h>

size_t fread(void* ptr, size_t size, size_t nmemb, FILE* stream);
size_t fwrite(const void* ptr, size_t size, size_t memb, FILE* stream);
  • ptr : Pointer to buffer
  • size : size of an item
  • nmemb : number of items to read/write
  • stream
  • return : read/write 한 item의 수 | EOF(-1) : 파일 끝

Formatted IO

#include <stdio.h>

int scanf(const char* format, ...);
int fscanf(FILE* stream, const char* format, ...);

int printf(const char* format, ...);
int fprintf(FILE* stream, const char* format, ...);
  • format : 입출력 형식
  • stream
  • return : 입출력한 문자 수 | 음수 : error

fflush

  • buffer에 있는 데이터를 바로 write-back -> fsync()와 동일
#include <stdio.h>

int fflush(FILE* stream);
  • stream
  • return
    • 0 : success
    • EOF(-1) : error

setvbuf

  • buffering mode 지정
#include <stdio.h>

int setvbuf(FILE* stream, char* buf, int mode, size_t size);
  • unbuffered(_IONBF) : 바로바로 전달
  • line-buffered(_IOLBF) : '\n'이 나올때까지(ex. stdout, stdin)
  • block-buffered(_IOFBF) : block size만큼(default)

Handling file offset

#include <stdio.h>

int fseek(FILE* stream, long offset, int whence);
long ftell(FILE* stream);
void rewind(FILE* stream);
int fsetpos(FILE* stream, const fpos_t *pos);
int fgetpos(FILE* stream, fpos_t *pos);
  • stream
  • offset : 이동시킬 byte 수(양수 or 음수)
  • whence : 기준 위치
  • pos : offset을 저장할 fpos_t 주소

File pointer <-> File Descriptor

#include <stdio.h>

FILE* fdopen(int fd, const char* mode);
int fileno(FILE* stream);

Using a temporal life

#include <stdio.h>

char* tmpnam(char* s);
char* tempnam(const char* dir, const char* pfx);
  • 중독 되지 않도록 임시파일명 생성(파일은 직접 열어야 함)
#include <stdio.h>

FILE* tmpfile();
  • 임시 파일 포인터 생성(파일명을 알 필요 없이, w+모드로 열린 파일 생성)

'💻 Computer Science > System' 카테고리의 다른 글

[System] 시스템 정보  (0) 2024.01.24
[System] Files in Unix/Linux  (1) 2024.01.24
[System] Low-Level File I/O  (1) 2024.01.23
[System] Thread  (0) 2024.01.04
[System] Event  (0) 2024.01.03