표준 스트림
프로그램의 메인 함수가 불려질 때, 그곳에는 이미 열기도 하고 사용도 할 수 있는, 미리 선언된 3개의 스트림을 갖게 된다. 이것은 프로세스를 위해 만들어놓은 "표준"의 입/출력을 표현하기 위함이다.
typedef struct {
int _cnt;
unsigned char *_ptr;
unsigned char *_base;
int _bufsize;
unsigned char _flag;
unsigned char_file;
}FILE;
파일을 생성하는 방법 create()
파일을 열고, 닫는 방법 open(), close()
파일을 읽고, 쓰는 방법 read(), write()
파일의 포인터 위치를 변경하는 함수 lseek()
파일의 정보를 나타내는 stat()
우리의 프로그램은 운영체제에 요청하고 모든 operation은 운영체제가 권한을 갖고 수행한다. 이것을 Application Programming Interface(API) 라고 부른다.
# File Descriptor
우리의 프로그램이 특정 파일에 접근하기 위해서 열면 integer 함수가 return된다. 즉, file의 주민등록번호라고 생각하면 편하다. File descriptor 0번 1번 2번은 미리 정의되어 있기 때문에 쓸 수 없다. 0번은 표준 입력(키보드)인데, 키보드는 파일이 아니다. 그러나 unix나 linux 계열에서, device는 파일 형식으로 interface를 생성한다. 1번은 표준 출력(모니터)이고, 2번은 표준 에러이다.
File Access도 기본적으로 sequential access이다. 그러나 운영체제에서 offset을 원하는 지점으로 옮길 수 있도록 해놓아서 random access가 가능하다.
Inode란 file과 관련된 모든 정보를 가지고 있는 meta block이다. File system을 포맷 후 설치하면 Inode 설정을 위해 비워놓기 때문에 가용 용량이 줄어든다.
모든 수정 작업은 디스크 캐싱을 사용한다. 즉, 고치는 일부분만 캐싱해서 사용함으로써 획기적으로 시간을 줄일 수 있다. 또한 수정된 부분만 flushing한다. close할 때 네트워크가 끊어지거나 디스크가 가득 차면 flush하는 동안 fail이 날 수 있다.
# Block IO
size_t fread(void *data, size_t size, size_t count, FILE *stream)
size_t fwrite(const void *data, size_t size, size_t count, FILE *stream)
Struct 단위로 파일을 읽고 쓰는 것을 말한다. 이것으로 파일 기반의 데이터베이스 매니지먼트 시스템을 만들 수 있다.
int fseek(FILE *stream, long int offset, int whence)
fseek는 offset에 sizeof(record)*30을 주면 31번째의 record를 찾는다.
whence :
int SEEK_SET
int SEEK_CUR
int SEEK_END
whence는 파일의 저장 위치의 기준을 잡는 것이다.