프로그래밍/리눅스 시스템

[Linux] 파일 입출력 함수

KimuGamJa 2024. 4. 14. 22:18

 

$ man 명령어 : 명령어, 함수들에 대한 설명 확인

: Shell command, system call, Linux library의 interface, header file, descriptioin을 확인할 수 있는 명령어

 

$ man [옵션] [검색할 매뉴얼 페이지 이름]

 

ex) open() Syscall에 대한 interface, header file을 보고 싶다면, $ man 2 open

  • [옵션]
  • -k : 키워드로 매뉴얼을 검색
  • 1 : Linux Shell Command
  • 2 : System Call
  • 3 : Linux Library

 

 

 

open() : 파일 오픈

 

int open(const char* path, int flag, mode_t mode)

  • 기능 : 파일 시스템에서 파일을 열어서 해당 파일에 대한 파일 디스크립터를 생성
  • 입력값 
    • path : 열고자 하는 파일의 경로
    • flag : 파일을 어떻게 열지를 지정하는 플래그, 필수옵션과 추가 옵션이 존재하며 두 옵션은 OR(|)기호로 연결한다.
    • [flag 필수 옵션]
      > O_RDONLY : 파일을 읽기 전용으로 연다.
      > O_WRONLY : 파일을 쓰기 전용으로 연다.
      > O_RDWR : 파일을 읽기 및 쓰기용으로 연다.
      [flag 추가옵션]
      > O_CREAT : 파일이 존재하지 않는 경우 새로운 파일을 새로 생성
      > O_APPEND : 덧붙이기 (쓰기용과 달리, 기존 내용은 유지한 채, 파일의 끝에 추가하여 쓰기 작업을 수행)
      > O_TRUNC : 파일 내용 제거 후 사용 (기존 파일의 내용을 모두 삭제하고 해당 파일 사용)
      => O_APPEND / O_TRUNC 없이 그냥 write()하는 경우, 기존 내용에 덮어쓰기 된다.
    • => flag 필수 옵션과 추가 옵션은 | 기호로 연결한다. ex) O_RDWR | O_CREAT
    • mode : 파일 생성할 때 줄 권한. 8진수로 입력한다. 0x(user)x(group)x(other)
      => (000 ~ 777 = 0b000000000 ~ 0b111111111 = --- --- --- ~ rwx rwx rwx) 
      [참고] other에 대한 권한은 보안상의 정책으로 무시되는 경우도 있다.
  • 반환값
    > 성공시 : open한 파일의 파일 디스크립트(int 양의 정수)를 반환
    > 실패시 : -1을 반환
  • 필요 라이브러리
    • #include <sys/types.h>
      #include <sys/stat.h>
      #include <fcntl.h>

 

💡open() 함수를 통한 파일 열기는 어떠한 권한(rxw)이 필요 없다!

 

 

 

read() : 파일 읽기

 

ssize_t read(int fd, void buf[.count], size_t count)

  • 기능 : fd에 해당하는 파일을 파일 오프셋 위치에서 부터 count 크기만큼 읽어서 buf에 저장한다.
  • 입력값
    • fd : 읽고자 하는 파일의 fd (open() 함수의 반환값)
    • buf : 파일에서 읽은 내용을 저장할 char buffer
    • count : 파일에서 읽고자하는 사이즈 (byte단위)
  • 반환값
    > 동작이 성공 : 읽은 바이트 수를 반환
    > 오류 시 : -1 반환
  • 필요 라이브러리 : #include <unistd.h>

    💡"unistd" = "Unix Standard"
    Unix 시스템에서 표준 입출력 함수나 파일 조작 함수 등을 정의하는 헤더 파일 중 하나
    Unix 시스템에서 프로그램을 작성할 때, 파일 입출력이나 시스템 콜(System Call) 등을 다룰 때 주로 사용된다.

 

 

wite() : 파일 쓰기

 

ssize_t write(int fd, const void buf[.count], size_t count )

  • 기능 : buf에 저장된 내용을 count만큼 fd의 파일 오프셋 위치에서부터 작성한다.
  • 입력값
    • fd : 쓰고자 하는 파일의 fd (open() 함수의 반환값)
    • buf : 파일에 쓸 내용이 저장된 buffet의 주소
    • count : 파일에 쓸 사이즈 (byte단위)
  • 반환값
    > 성공시 0 
    > 오류 시 -1
  • 필요 라이브러리 : #include <unistd.h>

 

 

 

close() : 파일 닫기

 

int close(int fd)

  • 기능
    • 파일 디스크립터를 닫는 시스템 콜.
    • 파일 디스크립터를 닫으면 해당 파일에 대한 모든 작업이 완료되며, 시스템 리소스가 해제된다.
    • 파일을 열고 사용한 후에 반드시 호출되어야 한다.
  • 입력값 fd : 닫고자 하는 파일의 디스크립트
  • 반환값 
    > 성공시 :  0을 반환
    > 실패시 : -1을 반환
  • 필요 라이브러리 : #include <unistd.h>

 

 

 

ssize_t 자료형
  • 정수형 데이터 타입이지만, OS의 bit 상관없이 개발을 할 수 있다는 이점을 가진다.
  • 주로 시스템 콜에서 파일 입출력과 관련된 바이트 수를 나타내는 데 사용된다.
  • 값의 범위
    • 32-bit 시스템에서 : ssize_t의 최소값과 최대값이 int형과 같다. (-2^32 ~ 2^32-1)
    • 64-bit 시스템에서 : 일반적으로 long형과 같은 크기를 가진다. (-2^64 ~ 2^64-1)
      => 64-bit 시스템에선, %lu를 이용 하여 출력한다!
    • 🚨하지만 플랫폼 및 컴파일러에 따라 다를 수 있으므로 실제 크기를 확인하기 위해 시스템의 헤더 파일을 참조하는 것이 좋다!

 

 

 

 

 

lseek() : 파일 오프셋 위치 이동

 

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

  • 기능 : 기준점에서 offset 만큼 떨어져 있는 곳으로 파일 위치를 옮기는 시스템콜
  • 입력값
    • fd : offset을 옮길 파일 디스크립트
    • offset : 이동할 바이트 수를 나타내는 파일 오프셋(offset) 값으로, whence가 기준이 된다.
      (long, 음수도 가능하다, 음수 입력시 whence 위치로 부터 뒤로 이동한다.)
    • whence : 이동할 기준 위치를 나타내는 정수 
      - SEEK_SET(=0): 파일의 맨 처음 시작 위치부터 offset 바이트를 이동
      - SEEK_CUR(=1): 현재 위치에서 offset 바이트를 이동 (파일 open후 처음에는 맨 처음이 cur위치이다.)
      - SEEK_END(=2): 파일의 맨 끝 위치+1부터 offset 바이트를 이동 (=> offset = -1일 때, 맨 끝 문자열을 의미)
  • 반환값 : 성공시 새로운 파일 위치(index)를 반환 / 실패시 -1