

physical file:
디스크상에 존재하는 파일
OS에 의해 관리됨
logical file:
프로그램이 볼 때의 파일 형태
physical file의 위치나 구조에 상관없이 작업 수행
file descriptor을 return
파일을 여는 방법 두가지
fd: file descriptor(integer)filename: physical file nameflags: 파일 열기 모드를 지정O_APPEND: 파일 끝에 추가로 데이터 쓰기O_CREAT: 파일이 없으면 생성O_EXCL: O_CREAT와 함께 사용, 이미 존재하는 파일 열기 실패O_RDONLY: 읽기 전용으로 열기O_RDWR: 읽기 쓰기로 열기O_TRUNC: 파일 열리고 기존 내용 삭제(파일이 존재하면 파일 사이즈를 0으로 만듦)O_WRONLY: 쓰기 전용으로 열기pmode (protection option): O_CREAT 사용 시 필요한 권한 모드pmode = 0751 (111 101 001)filename: 열 파일의 이름 (문자열)type: 파일 열기 모드를 문자열로 지정합니다."r": 읽기 전용으로 열기"w": 쓰기 전용으로 열기 (파일 없으면 생성, 기존 내용 삭제)"a": 파일 끝에 추가로 쓰기 (파일 없으면 생성)"r+": 읽기 쓰기 (파일 없으면 생성 실패)"w+": 읽기 쓰기 (파일 없으면 생성, 기존 내용 삭제)"a+": 읽기 쓰기 (파일 끝에 추가, 파일 없으면 생성)파일 열기 예시
fd = open(fname, O_RDWR|O_CREAT, 0751)fname을 읽기 쓰기 (O_RDWR) 모드로 열고, 파일이 없으면 생성 (O_CREAT)하며 권한 모드는 0751을 사용fd = open(fname, O_RDWR|O_CREAT|O_TRUNC, 0751)fname을 읽기 쓰기 (O_RDWR) 모드로 열고, 파일이 없으면 생성 (O_CREAT)하고 기존 내용 삭제 (O_TRUNC)하며 권한 모드는 0751을 사용fd = open(fname, O_RDWR|O_CREAT|O_EXCL, 0751)fname을 읽기 쓰기 (O_RDWR) 모드로 열고, 파일이 없으면 생성 (O_CREAT)하려고 하지만 이미 존재하면 에러를 발생 (O_EXCL)하며 권한 모드는 0751을 사용(파일이 이미 존재한다는 것은 다른 process가 접근했다는 것임→ 독점적 조건 플레그 때문에 접근 제한됨)file I/O program 에서 r/w하면 os buffer에 저장된 후 적절한 시점에 disk에 write함
→buffer에는 존재하지만 disk에는 쓰여있지 않은 상황이 존재할 수 있음
→이때 close를 호출하면 buffer에 있는 data를 write함
데이터를 파일과 프로그램 간에 이동시키는 중요한 작업
read(source_file, destination_addr, size): 소스 파일에서 데이터를 읽어 목적지 주소 (destination_addr)에 저장 size는 읽을 바이트 수write(destination_file, source_addr, size): 소스 주소 (source_addr)에 있는 데이터를 목적지 파일 (destination_file)에 저장 size는 쓸 바이트 수파일 스트림 (file stream: 파일과 연결된 가상적인 데이터 흐름) 개념 사용
fread(ptr, size, count, stream): 파일 스트림 stream에서 size 바이트 크기의 데이터를 count 개 읽어 ptr이 가리키는 메모리 위치에 저장fgets(str, num, stream): 파일 스트림 stream에서 최대 num-1개의 문자를 읽어 str 문자열에 저장. 개행 문자 (\n)를 만나면 읽기를 멈추고 문자열에 포함fwrite(ptr, size, count, stream): ptr이 가리키는 메모리 위치에 있는 size 바이트 크기의 데이터를 count 개 파일 스트림 stream에 작성fputs(str, stream): 문자열 str에 있는 내용을 파일 스트림 stream에 작성. 개행 문자 (\n)는 자동으로 추가되지 않음fscanf(stream, format, ...): 파일 스트림 stream에서 데이터를 읽어 형식 문자열 (format)에 따라 변수에 저장fprintf(stream, format, ...): 형식 문자열 (format)에 따라 변수의 값을 파일 스트림 stream에 출력특정 위치로 빠르게 이동
source_file: logical file nameoffset: 파일 내의 특정 기준 위치에서 얼마나 앞/뒤로 이동할지 결정하는 바이트 수origin: offset 값을 적용할 기준 위치를 설정 값SEEK_SET: 파일의 처음 (0 바이트 위치)을 기준으로 이동⇒0SEEK_CUR: 현재 파일 포인터 위치를 기준으로 이동⇒1SEEK_END: 파일 끝 (파일 크기)를 기준으로 이동 (offset 값이 음수이면 파일 끝에서 앞으로 이동)⇒2*함수 호출 후 ptr위치는 +1 됨
사용자로부터 파일 이름을 입력받아 해당 파일을 열고, 파일의 시작 위치에서 501 바이트 이동한 다음, 그 위치부터 파일 끝까지의 내용을 표준 출력( 화면)에 출력
#include <stdio.h>
#include <fcntl.h>
main() {
char c;
int fd;/* file descriptor */
char filename[20];
printf (“Enter the name of the file: “);
gets (filename);
fd = open (filename, O_RDONLY);
lseek (fd, 501L, 0);
//맨 앞을 기준으로 501 이동,포인터 위치는 501에 가있음
//정상적으로 수행되면 read는 size를 return
//0을 Return하는 것은 파일의 끝(EOF)
while (read(fd, &c, 1) != 0)
write (1, &c, 1);
//1은 모니터(화면에 출력)
close (fd);
} /* end of main */