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 |