ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2. File I/O - library calls(1)
    HW & SW Interface/System Programming 2020. 5. 5. 00:57

    # File I/O review

    파일 관련 시스템 프로그래밍을 위한 system calls과 library calls을 알아볼 것이다.

    각각의 calls 관련 함수는 다음과 같으며 이번 포스팅에서는 library 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();

     

     

    # Library

    라이브러리는 System calls을 통해 커널에 있는 유틸리티를 사용하도록 만들어진 하나의 프로그램이다. 유저가 자주 사용하는 기능들을 함수화해서 모아둔 객체로 볼 수 있으며, 라이브러리가 제공하는 API(library calls)를 유저가 호출하면 링커에 의해 연결되서 프로그램이 실행되는 것이다.

     

    ▶ 라이브러리 종류

     shared library (*.so, *.dll)

      - 프로세스 간 공유하는 라이브러리

      - 메모리에 하나만 적재되어있기 때문에 메모리 효율이 높다.

      - 라이브러리와 프로그램을 연결하는 링크가 있다.

      - 서버에 주로 사용된다.

     

     static library (*.a)

      - 각각의 프로그램에 존재하는 라이브러리

      - 메모리 효율이 낮다.

      - 링킹 작업이 없기 때문에 실행 속도가 빠르다

      - 임베디드에 주로 사용된다.

     

     

    # Standard I/O Library

    <stdio.h>file I/O를 위한 라이브러리 콜이 정의되어 있는 헤더 파일이다.

    library calls을 할 때는 File stream(파일 포인터 객체/ FILE*)를 이용한다. 

     

     

    # File descriptor

    다음에 자세히 살펴볼 것이지만 비교를 위해 적어둔다. 

    File descriptor는 library calls이 아니라, system calls을 할 때 이용하는 것으로 정수 값이다.

    File descriptor 0/ 1/ 2는 각각 stdin/ stdout/ stderr에 대응되는 값이다. 

     

    라이브러리 콜은 결국 시스템 콜을 위한 것이라면 '그냥 처음부터 시스템 콜을 이용하면 되지 왜 라이브러리 콜을 사용하는가?'라는 의문이 든다. 그 이유는 유저 측면에서 직접 시스템 콜을 호출하는 것 보다 라이브러리 콜을 호출하는 것이 더 쉽고, 편리하기 때문이다. 또한 성능적인 면에서 user level buffering이라는 기능을 사용할 수 있기 때문에 라이브러리 콜을 이용한다.

     

     

    # File stream vs. File descriptor

    File stream과 File descriptor는 일대일로 연결되며, 이 연결을 위한 함수는 다음과 같다.

     

    File stream -> File descriptor

    file stream을 인자로 넘기면, 이에 대응되는 file descriptor 값을 return

    #include <stdio.h>
    int fileno(FILE *stream);

    File descriptor -> File stream

    file descriptor와 파일을 open할 때 mode(r, w, a ...)를 인자로 넘기면, 이에 대등되는 file stream obj을 return

    #include <stdio.h>
    FILE *fdopen(int fd, const char *mode);

     

     

    # Library Buffering

    user level buffering(library buffering)이란 시스템 콜의 횟수를 줄여 성능을 높이는 방법이다. buffer란 데이터를 임시로 저장하는 메모리 공간으로 유저 프로그램과 연결되어 있다. 메모리에서는 버퍼에 데이터를 쌓아두고 어느정도 버퍼가 채워졌을 때, 이를 한 번에 커널로 보낸다. (커널로 데이터를 보내는 작업이 시스템 콜인데 버퍼를 이용해 이 횟수를 줄인 것이다.)

     

    library buffering은 Full buffering/ Line buffering/ Unbuffering으로 나눌 수 있다.

    리눅스에서는 기본적으로 stderr는 unbuffering, stdin과 stdout은 line buffering, 그 외의 것은 default로 full buffering을 한다. 

     

    Buffering 설정

    #include <stdio.h>
    //유저가 지정한 주소에 버퍼 설정
    void setbuf(FILE *stream, char *buf);
    
    //버퍼 타입도 설정
    int setvbuf(FILE *stream, char *buf, int type, size_t size);
    //return 0 if success
    TYPE MEANING
    _IOFBF Full buffering
    _IOLBF Line buffering
    _IONBF Unbuffering

     

     

     

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

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

    댓글

Designed by Tistory.