리눅스 파일 입출력

펀크·2024년 12월 10일

리눅스 파일 입출력 정리

리눅스에서 파일 입출력은 데이터를 파일에 저장하거나 파일에서 읽어들이는 기능으로, 운영체제와 직접적으로 상호작용하는 중요한 작업입니다. 파일 입출력은 크게 저수준 파일 입출력고수준 파일 입출력으로 나뉩니다. 이번 글에서는 두 방식의 차이점과 사용법을 살펴보겠습니다.


1. 저수준 파일 입출력

특징

  • 시스템 호출을 사용하여 운영체제와 직접 통신합니다.
  • unistd.hfcntl.h 헤더 파일의 함수들을 사용합니다.
  • 파일 디스크립터(File Descriptor)를 반환받아 파일을 조작합니다.
  • 빠른 처리 속도를 제공하지만, 사용이 비교적 복잡합니다.

주요 함수

  1. open
    파일을 열거나 새로 생성하는 함수입니다.

    int open(const char *pathname, int flags, mode_t mode);
    • pathname: 열고자 하는 파일의 경로.
    • flags: 파일 열기 모드(O_RDONLY, O_WRONLY, O_RDWR 등).
    • mode: 파일 생성 시 권한(선택적).
  2. read
    파일에서 데이터를 읽어오는 함수입니다.

    ssize_t read(int fd, void *buf, size_t count);
    • fd: 파일 디스크립터.
    • buf: 읽어들인 데이터를 저장할 버퍼.
    • count: 읽을 바이트 크기.
  3. write
    데이터를 파일에 쓰는 함수입니다.

    ssize_t write(int fd, const void *buf, size_t count);
  4. close
    열린 파일을 닫는 함수입니다.

    int close(int fd);

예제 코드: 파일 읽기

#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>

int main() {
    int fd = open("example.txt", O_RDONLY); // 읽기 전용으로 파일 열기
    if (fd == -1) {
        perror("파일 열기 실패");
        return 1;
    }

    char buffer[128];
    ssize_t bytesRead = read(fd, buffer, sizeof(buffer) - 1); // 파일 읽기
    if (bytesRead == -1) {
        perror("파일 읽기 실패");
        close(fd);
        return 1;
    }

    buffer[bytesRead] = '\0'; // 문자열로 처리하기 위해 NULL 추가
    printf("파일 내용: %s\n", buffer);

    close(fd); // 파일 닫기
    return 0;
}

2. 고수준 파일 입출력

특징

  • C 표준 라이브러리 함수를 사용하여 파일을 조작합니다.
  • stdio.h 헤더 파일의 함수를 사용합니다.
  • 간단하고 직관적이며, 파일 스트림(Stream) 개념을 사용합니다.
  • 운영체제의 직접적인 관여가 적어 저수준보다 약간 느릴 수 있습니다.

주요 함수

  1. fopen
    파일을 열거나 새로 생성하는 함수입니다.

    FILE *fopen(const char *pathname, const char *mode);
    • pathname: 파일 경로.
    • mode: 파일 열기 모드("r", "w", "a" 등).
  2. fgets
    파일에서 한 줄의 데이터를 읽어오는 함수입니다.

    char *fgets(char *str, int n, FILE *stream);
  3. fprintf
    데이터를 파일에 쓰는 함수입니다.

    int fprintf(FILE *stream, const char *format, ...);
  4. fclose
    열린 파일을 닫는 함수입니다.

    int fclose(FILE *stream);

예제 코드: 파일 쓰기

#include <stdio.h>

int main() {
    FILE *fp = fopen("output.txt", "w"); // 쓰기 모드로 파일 열기
    if (fp == NULL) {
        perror("파일 열기 실패");
        return 1;
    }

    fprintf(fp, "Hello, World!\n"); // 파일에 쓰기
    fprintf(fp, "이것은 고수준 파일 입출력 예제입니다.\n");

    fclose(fp); // 파일 닫기
    return 0;
}

3. 저수준과 고수준의 차이점

구분저수준 파일 입출력고수준 파일 입출력
접근 방식시스템 호출 사용C 표준 라이브러리 사용
함수 예시open, read, writefopen, fgets, fprintf
반환 값파일 디스크립터(int)파일 포인터(FILE *)
사용 용이성복잡함간단함
처리 속도빠름상대적으로 느림

마무리

리눅스 파일 입출력은 각각의 장점과 용도가 다릅니다.

  • 저수준 파일 입출력: 성능이 중요하거나 시스템 수준 제어가 필요할 때 사용.
  • 고수준 파일 입출력: 사용이 편리하고 대부분의 일반적인 작업에 적합.
profile
개발자 아닙니다

0개의 댓글