리눅스

chapter02 파일 입출력(01,02)

정지홍 2023. 2. 10. 09:03

파일?

-관련 있는 데이터의 집합이며 하드디스크와 같은 물리적 저장 장치에 저장됨

-일반 파일: 텍스트 바이너리 형태의 데이터를 저장하는 파일

-특수 파일: 데이터 전송, 장치 접근에 사용하는 파일

 

저수준 파일 입출력

-커널의 시스템 호출을 사용한다.

-파일에 좀 더 빨리 접근 가능.

-바이트 단위로 파일을 다루어서 특수파일도 read,write 가능->함수 자체 구조는 대부분 단순

-파일 기술자 사용(file descripter, 정수형이며 파일을 구분하기 위해 번호를 붙힘. )

 

고수준 파일 입출력

-데이터를 버퍼단위로 read,write

-다양한 입출력 데이터 변환기능

-파일 포인터 사용


저수준 파일 입출력

 

파일 기술자

-저수준 파일 입출력에서 열린 파일 참조하는데 사용

-파일 구분하기 위해 번호를 붙힘

-0은 표준입력(보통 파일 기술자는 키보드)

-1은 표준출력(보통 파일 기술자는 모니터 화면)

-2는 표준오류출력(보통 파일 기술자는 모니터 화면)

-open함수가 파일 열기 성공시에 파일 기술자가 리턴됨

 

파일을 read,write하기 위해서는 파일은 open하고 완료후에 close를 해야한다.

 

주요 파일 상태 플래그(oflag)

  • O_RDONLY 읽기전용 열기
  • O_WRONLY 쓰기전용 열기
  • O_RDWR 읽기쓰기 전용 열기
  • O_CREAT 파일 생성, 이미 존재시 의미 없다.
  • O_EXCL  파일 생성, 이미 존재시 오류 메시지 출력
  • O_APPEND 파일의 맨 끝에 내용 추가
  • O_TRUNC 쓰기옵션으로 열었을때 내용을 모두 없애고 파일 길이를 0으로 변경

 

설정 가능 모드 종류

-S_IRWXU : 소유자 읽기/쓰기/실행 권한

-S_IRWXG : 그룹 읽기/쓰기/실행 권한

-S_IRWXO : 기타 사용자 읽기/쓰기/실행 권한

open 함수를 사용해서 unix.txt 생성
파일 생성


O_EXCL사용 에제, 파일 존재시 파일 생성 안하고 오류 메시지 출력
파일 존재한다는 오류 메시지 출력
파일 기술자 할당하기

 

 


파일을 읽을때는 read함수, 쓸때는 write함수 사용


파일 오프셋 지정

오프셋

-파일의 내용을 읽거나 쓰면 현재 읽을 위치 혹은 쓸 위치를 알려주는 것

-파일 시작지점부터 현재 위치까지의 바이트 수이다.

-한 파일에서 오프셋은 오직 하나(read/write모드로 열었을때 각각 오프셋이 따로 있지 않다는 것)

 

lseek함수

-오프셋의 위치를 바꾸거나 확인할때 사용

-off_t lseek(int fildes 파일 기술자 , off_t offset 이동할 오프셋 위치 , int whence 오프셋의 기준 위치 ) 음수 사용 가능

 

  • SEEK_SET: 파일의 시작 기준
  • SEEK_CUR: 현재 위치 기준
  • SEEK_END: 파일의 끝 기준

실행해보면 각각의 페이지 오프셋의 위치가 달라짐을 알 수 있다.

   


파일 기술자 복사

-파일을 열면 파일 기술자가 할당되는데 이때 dup함수 혹은 dup2함수를 사용하여 이 파일 기술자를 복사하는게 가능하다.

-int dup(int fildes 파일 기술자); -->기존 파일 기술자를 인자로 받아서 새로운 파일 기술자를 리턴하며 이때 가장 작은 값으로 할당됨

dup 예제
dup2를 사용해서 기존 파일 기술자를 1번 파일 기술자로 복사


파일을 삭제하려면 unlink 함수를 사용

int unlink(const char *path 삭제할 파일의 경로) -->path에 지정한 파일의 inode에서 링크수를 감소시키며 이것이 0이 되면 지정한 파일이 삭제된다. 비슷한 함수로 int remove(const char *path)가 있다.

unlink를 사용하여 tmp.aaa 삭제