[파일처리]chapter 2

rianne·2024년 4월 25일

파일처리

목록 보기
2/3
post-thumbnail

Chapter 2: Fundamental File Processing Operations

Physical Files and Logical Files


physical file:

디스크상에 존재하는 파일

OS에 의해 관리됨

logical file:

프로그램이 볼 때의 파일 형태

physical file의 위치나 구조에 상관없이 작업 수행

Opening files

  • physical file과 logical file의 connection
  • file descriptor을 return

  • 파일을 여는 방법 두가지

    1. 기존 파일 열기
    2. 파일 생성 및 열기

시스템 콜

💡 fd=open(filename, flags [, pmode]);
  • 인자 설명:
    • fd: file descriptor(integer)
    • filename: physical file name
    • flags: 파일 열기 모드를 지정
      • O_APPEND: 파일 끝에 추가로 데이터 쓰기
      • O_CREAT: 파일이 없으면 생성
      • O_EXCLO_CREAT와 함께 사용, 이미 존재하는 파일 열기 실패
      • O_RDONLY: 읽기 전용으로 열기
      • O_RDWR: 읽기 쓰기로 열기
      • O_TRUNC: 파일 열리고 기존 내용 삭제(파일이 존재하면 파일 사이즈를 0으로 만듦)
      • O_WRONLY: 쓰기 전용으로 열기
    • pmode (protection option): O_CREAT 사용 시 필요한 권한 모드
      • 3자리 8진수로 표기
      • owner/group/other 각각에 대해서 read/write/excute(읽기쓰기실행)권한 부여
      • (예시)pmode = 0751 (111 101 001)
        • 소유자: 읽기, 쓰기, 실행 권한 모두 있음 (111)
        • 그룹: 읽기, 실행 권한 있음 (101)
        • 기타: 실행 권한만 있음 (001)

C 표준 입출력 (stdio.h 라이브러리)

💡 file = fopen(filename, type);
  • 인자 설명:
    • 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가 접근했다는 것임→ 독점적 조건 플레그 때문에 접근 제한됨)

Closing files

  • 리소스 해제: 파일 식별자 (file descriptor)와 같은 시스템 리소스를 해제하여 다른 파일에 사용할 수 있도록 함
  • 데이터 저장: 프로그램에서 파일에 쓴 데이터가 실제 저장 장치 (하드디스크, SSD 등)에 반영되도록 함. 운영체제는 여러 가지 이유로 데이터 쓰기를 버퍼링 (buffering) 할 수 있기 때문에 파일을 닫는 순간 데이터가 실제로 저장 장치에 쓰여짐.

    file I/O program 에서 r/w하면 os buffer에 저장된 후 적절한 시점에 disk에 write함
    →buffer에는 존재하지만 disk에는 쓰여있지 않은 상황이 존재할 수 있음
    →이때 close를 호출하면 buffer에 있는 data를 write함

  • 파일 무결성 유지: 파일을 닫으면 운영체제가 파일을 닫고 다른 프로그램이 액세스할 수 없도록 함(파일 손상 방지)

Reading & Writing

데이터를 파일과 프로그램 간에 이동시키는 중요한 작업

시스템 콜

  • read(source_file, destination_addr, size): 소스 파일에서 데이터를 읽어 목적지 주소 (destination_addr)에 저장 size는 읽을 바이트 수
  • write(destination_file, source_addr, size): 소스 주소 (source_addr)에 있는 데이터를 목적지 파일 (destination_file)에 저장 size는 쓸 바이트 수

C 표준 입출력 (stdio.h 라이브러리)

파일 스트림 (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에 출력

Seeking

특정 위치로 빠르게 이동

시스템 콜

💡 *lseek(source_file, offset, origin);*
  • 인자 설명:
    • source_file: logical file name
    • offset: 파일 내의 특정 기준 위치에서 얼마나 앞/뒤로 이동할지 결정하는 바이트 수
      • 양수(+) 입력: 현재 위치에서 앞으로 이동
      • 음수(-) 입력: 현재 위치에서 뒤로 이동
      • 0 입력: 현재 위치 유지
    • origin:  offset 값을 적용할 기준 위치를 설정 값

C 표준 입출력 (stdio.h 라이브러리)

💡 *pos = fseek(file, byte_offset, origin);*
  • SEEK_SET: 파일의 처음 (0 바이트 위치)을 기준으로 이동⇒0
  • SEEK_CUR: 현재 파일 포인터 위치를 기준으로 이동⇒1
  • SEEK_END: 파일 끝 (파일 크기)를 기준으로 이동 (offset 값이 음수이면 파일 끝에서 앞으로 이동)⇒2

*함수 호출 후 ptr위치는 +1 됨

Example Program

사용자로부터 파일 이름을 입력받아 해당 파일을 열고, 파일의 시작 위치에서 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 */

0개의 댓글