본문 바로가기
programming/Unix

[Unix Programming] 4. 파일 입출력

by je0nsye0n 2024. 12. 9.

유닉스 파일 접근

  • file : byte들의 linear sequence
  • 저수준 파일 입출력 : os와 바로 연결

 

file descriptor

  • 현재 open된 파일을 구분할 목적으로 유닉스가 붙여 놓은 번호
  • 표준 입출력
    • 0 : 표준 입력 (키보드)
    • 1 : 표준 출력 (화면 출력)
    • 2 : 표준 오류 출력
  • 한 프로세스가 동시에 open할 수 있는 파일의 개수에는 제한이 있음 → close 사용하기

 

open 시스템 호출

  • 기존의 파일을 open하거나, 새로운 file을 생성하여 open하는 시스템 콜

int open(const char *filename, int oflag, [mode_t mode]);

return : file descriptor 번호 / -1

  • 인수 사용법
    • filename : 파일 이름
    • oflag :
      • O_RDONLY
      • O_WRONLY
      • O_RDWR
      • O_CREAT - 파일이 없으면 만들고 있으면 기존의 것 open
      • O_EXCL - 파일이 존재하면 open 실패 (O_CREAT와 반드시 함께)
      • O_TRUNC - 기존에 있는 내용을 지움
      • O_APPEND - 원하는 위치에서 file open 가능
    • mode : file을 새로 생성할 때만 사용

 

creat 시스템 호출

  • 주의 사항 :
    • 파일을 쓰기 가능한 상태로 open
    • file이 존재하면, 두번째 인자는 무시; 기존 파일은 0으로 open!

int creat(const char *filename, mode_t mode);

 

close 시스템 호출

  • open된 파일을 close할 때 사용
    • 사용 이유 : 프로세스 종료시 open된 파일들은 자동으로 close됨. 그러나 동시에 open할 수 있는 파일 수 제한 때문에 사용하는 것임.

int close(int filedes);

return : 0 / -1

 

read 시스템 호출

  • open된 파일로부터 지정한 byte수 만큼 data를 읽어 저장장소에 저장하는 명령
    • file pointer or read-write pointer : 읽혀질 다음 바이트의 위치를 나타냄

ssize_t read(int filedes, void *buffer, size_t nbytes);

return : 실제 읽힌 byte 수 / -1

→ return 값 < nbytes : file에 남은 데이터가 nbytes보다 적은 경우.

→ 그 다음은 더 이상 읽을게 없으면, return 값은 0

  • 인수 사용법
    • filedes : open된 파일 디스크립터
    • *buffer : 읽을 데이터를 저장할 곳의 주소. 데이터 타입을 상관 X
    • nbytes : 읽을 바이트 수; 데이터 타입에 상관 없이 지정된 데이터 바이트 수 만큼 읽음

 

write 시스템 호출

  • 지정된 저장장소에서 지정한 바이트수 만큼의 데이터를 읽어 open된 파일에 쓰는 명령어
    • file pointer or read-write pointer : 읽혀질 다음 바이트의 위치를 나타냄

ssize_t write(int filedes, const void *buffer, size_t nbytes);

return : 쓰여진 바이트 수 / -1

→ 보통은 return값 = nbytes

→ return 값이 n보다 작은 경우는 도중에 파일이 꽉찬 경우임.

→ 만약, 쓰기 전에 꽉 차면 -1 return

  • 인수 사용법
    • filedes : write할 파일 디스크립터
    • *buffer : write할 내용이 들어 있는 저장 장소의 주소
    • nbytes : write할 바이트의 수
  • 주의할 점
    • 기존 파일을 open하고 write를 하는 경우에는 덮어쓰게됨. 따라서 덮어쓰는게 싫다면 open할 때 “O_APPEND”를 사용해야함.

 

read/write의 효율성

  • 파일을 카피하는 프로그램의 실행시간
    • 버퍼사이즈가 512일때 가장 효율적임
    • 시스템 콜의 수가 적을 수록 효율적임

 

lseek와 임의 접근

  • open된 파일 내의 특정 위치로 파일 포인터를 이동시키는 시스템콜

off_t lseek(int filedes, off_t offset, int whence);

return : 이동된 위치(시작점부터의 위치) / -1

  • 인수 사용법
    • filedes
    • whence : whence에서 offset만큼 떨어진 위치로 이동
      • SEEK_SET : 시작 지점
      • SEEK_CUR : 현재 파일 위치
      • SEEK_END : 파일 끝 지점
    • offset : whence에서 오프셋만큼 떨어진 위치로 이동 (+/-로 설정 가능)

 

file의 제거

  • file을 삭제하는 명령

int unlink(const char *filename);

int remove(const char *filename);