리눅스 파일 입출력

펀크·2024년 12월 10일
0

리눅스 파일 입출력 정리

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


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개의 댓글