ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 5. File I/O - system calls(1)
    HW & SW Interface/System Programming 2020. 5. 5. 20:07

    # File I/O review

    파일 관련 시스템 프로그래밍을 위한 system calls과 library calls의 관련 함수는 다음과 같으며,

    이번 포스팅에서는 system calls을 집중적으로 볼 것이다.

     

    System Calls for File descriptor I/O

     - open(); close(); creat(); read(); write();

     - seek();

     - fcntl();

     

    Library Calls for File I/O (File stream)

     - fopen(); freopen(); fclose(); fread(); fwrite();

     - fgetc(); fgetchar(); fputc(), putchar();

     - fseek(); fprintf(); fscanf();

     

     

    # Linux File System

    리눅스 커널은 Process/ File/ Memory/ Device 등 몇 가지 부분으로 모듈화 되어 있으며, 그 중 File System은 가장 중요한 부분이라고 할 수 있다. File System에서 하는 가장 중요한 일은 storage(HDD)에 저장되어 있는 파일에 대한 관리와 파일 관련 인터페이스를 유저에게 제공하는 것(system call)이라 할 수 있다.

     

    리눅스 파일 시스템에서 모든 파일들은 자신만의 inode를 가지고 있다. inode란 파일의 모든 정보를 관리하는(담고 있는) data structure(block 단위로 관리)이다. 파일의 모든 정보라함은 파일명/ 타입/ owner id/ 접근 권한/ 생성 및 수정 시간/ 파일 크기/ data block의 주소 등을 말한다. inode는 파일의 실제 정보가 기록되어 있는 block의 주소를 관리한다. 즉, 리눅스 파일 시스템은 파일의 정보를 inode를 통해 block 단위로 관리한다.

     

     

    # File Descriptor

    File Descriptor는 system calls에서 파일을 지칭하는 정보로 사용되며, 0 이상의 정수 값이다. 

    파일을 open할 때마다 해당 파일의 file descriptor 값을 반환하기 때문에, 너무 많은 파일이 open될 경우 커널 자원이 한계에 도달한다. 이를 방지하기 위해 한 프로세스에서 open할 수 있는 파일의 수를 1024개로 제한을 둔다.

     


    # File Open

    #include <fcntl.h>
    int open(const char *path, int oflag, mode_t mode);

    parameters

    • path: 파일 경로(이름)
    • oflag: 옵션 -> | 를 이용하여 두 개 이상의 옵션을 붙일 수 있다.
    • mode: 접근 권한 ( S_ISUID/ S_ISGID/ S_ISVTX ...)

     

    필수 옵션 의미
    O_RDONLY open for read-only
    O_WRONLY open for write-only
    O_RDWR open for reading & writing
    선택 옵션 의미
    O_CREAT 파일 존재하지 않으면 생성
    O_EXCL

    파일 존재하지 않으면 생성

    파일이 존재하면 return error

    O_TRUNC 파일 존재하면 내용 삭제
    O_APPEND 파일 끝에서부터 쓰기
    O_SYNC file I/O를 할 때 동기화

     

    return

    • 성공 -> file descriptor
    • 실패 -> -1

     

     

    # File Close

    #include <unistd.h>
    int close(int fd);

    return

    • 성공 -> 0
    • 실패 -> -1

     

     

    # File Creation

    create이 아님에 주의하자!

    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    int creat(const char *path, mode_t mode);

    return

    • 성공 -> file descriptor
    • 실패 -> -1

     

     

    # File Seeking

    #include <sys/types.h>
    #include <unistd.h>
    off_t lseek(int fd, off_t offset, int whence);

    parameters

    • offset: 옵션에 대한 offset 위치
    • whence: 옵션(SEEK_SET/ SEEK_CUR, SEEK_END)

     

    return

    • 성공 -> offset 값
    • 실패 -> -1

     

     

    # File Read

    #include <unistd.h>
    ssize_t read(int fd, void *buf, size_t nbyte);

    parameters

    • buf: 읽을 버퍼 주소
    • nbyte: 읽을 바이트 수

     

    return

    • 성공 -> 읽은 바이트 수
    • 실패 -> -1

     

     

    # File Write

    #include <unistd.h>
    ssize_t write(int fd, const void *buf, size_t nbyte);

    parameters

    • buf: 쓸 버퍼 주소
    • nbyte: 쓸 바이트 수

     

    return

    • 성공 -> 쓴 바이트 수
    • 실패 -> -1

    'HW & SW Interface > System Programming' 카테고리의 다른 글

    4. File I/O - library calls(3)  (0) 2020.05.05
    3. File I/O - library calls(2)  (0) 2020.05.05
    2. File I/O - library calls(1)  (0) 2020.05.05
    1. Introduction  (0) 2020.05.04

    댓글

Designed by Tistory.