ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Linux] 파일 입출력 함수
    프로그래밍/리눅스 시스템 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
Designed by Tistory.
-->