본문 바로가기

파일 처리

[파일처리] 파일처리의 개념 / SystemCall에서의 파일 관리

Physical Files과 Logical Files

  • Physical File:
    - 하드웨어 레벨에서 실제 데이터가 메모리나 디스크에 저장되는 방법
    - OS에 의해 관리되는 file directory
    - secondary storage에 존재함
  • Logical File:
    - physical file를 신경쓰지 않고, 유저나 프로그래머에 의해 보이고, 접근되고, 관리되는 데이터

정의는 위와 같지만 사실 이 설명만으로는 잘 들어오지 않는 개념이다.

예를 하나 들어보자. 만약에 내가 다른 사람에게 전화를 하고싶을 때 필요한것은 무엇인가?

 

전화를 걸고자 하는 사람의 이름과 전화번호애 대한 정보만 있으면 전화를 걸 수 있다. 나는 전화가 어떻게 회선을 타고 신호가 전달되는지, 네트워크 인프라 등에대한 정보를 알 필요가 없다.

 

이처럼 유저가 작업을 할때 필요한 데이터를 Logical File, 모든 정보를 가지고있는 파일을 Physical File이라고 생각하면 쉽게 이해가 갈 것이다.

 


System Call에서의 파일 처리

파일 열기:

fd = open(filename, flags [,pmodel])

  • fd : file descriptor로 Logical file에 해당한다 open을 이용해 파일을 열면 fd로 파일에 대한 읽기/쓰기 작업에 접근한다.(Integer)
  • filename : physical file의 이름이다. 해당 파일을 접근할 때 filename에 명시한다.
  • flags : 파일을 열 때 필요한 다양한 형식을 명시한다.
    • O_RDONLY : 오직 읽기 권한만을 주고 파일을 여는것
    • O_WRONLY : 오직 쓰기 권한만을 주고 파일을 여는것
    • O_RDWR : 읽기 쓰기 권한을 모두 주고 파일을 여는것
      ※ 파일을 열때 권한을 주지 않으면 제대로 작동을 하지 않는다 아래의 옵션은 선택이지만 위의 옵션은 필수로 주어야 한다.

    • O_APPEND : 파일에 쓰기를 할 때 무조건 파일의 맨 뒤에 쓰기 작업을 하도록 하는 옵션. 해당 옵션을 사용하면 lseek()로 current file position을 바꾸어도 항상 파일의 맨 뒤에 쓰기가 된다. 따라서 여러 프로세스가 동시에 접근해도 파일이 덮어씌어지지 않아 안전하다.

    • O_CREAT : 파일 생성(Create) 옵션으로, 파일이 존재하지 않으면 새로 생성하고, 존재하면 기존 파일을 그대로 연다. O_CREAT 옵션은 추가로 [pmode]를 설정해주어야 한다. pmode는 open()을 할 때 기존 파일이 없어 새로 파일을 만들게 될 경우 적용되는 권한에 대한 옵션이며, 파일이 이미 존재하면 따로 쓰이지 않는다.
      pmode는 필수는 아니지만 설정하지 않을 시 쓰레기값이 들어갈 위험이 있어 권장되는 사항이다. 
      pmode : [owner, group, others]에 대해 각각 [read, write, execute]의 권한을 설정해주는 값이다. 
      예를 들어 0751 = 111 101 001 이므로 각각 rwe re e권한이 주어진다. 

    • O_EXCL : exclusive의 앞글자를 딴 것으로 파일을 오픈할 때 이미 해당 파일이 존재하면 open()을 실패하도록 하는 옵션이다. 따라서 O_CREAT와 같이 사용하여 파일을 생성할 때 해당 이름을 가진 파일이 이미 존재하면 EEXIST오류를 반환한다.

    • O_TRUNC :파일을 열 때 기존 내용을 삭제(0바이트로 초기화)하는 옵션. 파일이 이미 존재하면, 그 내용을 지우고 처음부터 다시 쓰기 가능하게 만든다.단, 파일이 없을 경우 O_CREAT 없이 사용했다면, 오류(ENOENT: No such file or directory)가 발생한다.

open()은 성공시 0이상의 정수 실패시 -1 반환


파일 닫기:

  • close(fd) - Logical File인 fd를 close하여 리소스를 반환한다.

파일 읽기:

  • read(source_file, destination_addr, size)
    • source_file : 어떤 file에 읽기 작업을 할 지 선언. Logical File 매개변수로 넘긴다.
    • destination_addr : 읽은 데이터를 어디에 저장할 것인지 선언. buffer의 주소값을 넘겨준다고 생각하면 편하다.
    • size : 얼마만큼의 데이터를 읽을지 명시한다. 

read()는 성공시 읽기를 한 크기(bytes) 실패시 -1 반환


파일 쓰기 :

  • write(destination_file, source_addr, size)
    • destination_file : 어떤 파일에 쓰기 작업을 할지 선언. Logical File 매개변수로 넘긴다.
    • source_addr : 어디에 저장된 데이터를 쓸지 선언. buffer의 주소값을 넘겨준다고 생각하면 편하다.
    • size : 얼마만큼의 데이터를 쓸지 명시한다.

write()는 성공시 쓰기를 한 크기(bytes) 실패시 -1 반환


Seeking :

  • lseek(source_file, offset, origin)
    • source_file : 파일 디스크립터 fd
    • offset : 이동할 바이트 수
    • origin : 기준점. SEEK_SET(0), SEEK_CUR(1), SEEK_END(2) 중 한 값을 선택하여 어느 기준점부터 offset만큼 이동할 지 선언. 참고로 SEEK_END가 가리키는 값은 EOF이다. 

lseek()는 성공시 새로운 offset위치, 실패시 -1을 반환함.

'파일 처리' 카테고리의 다른 글