Interview/OS

Linux OS File Descriptor

김 정출 2024. 9. 26. 11:33

파일 디스크립터

  • 파일 디스크립터(File Descriptor)는 LinuxUnix 기반 운영체제에서 파일이나 입출력 리소스에 접근할 때 사용하는 추상적인 핸들입니다. 운영체제는 파일 디스크립터를 통해 파일, 소켓, 파이프, 표준 입출력 장치와 같은 다양한 입출력 자원을 관리하고 접근할 수 있습니다.

파일 디스크립터의 역할

  1. 파일 식별자 역할
    • 파일 디스크립터는 운영체제 내부에서 열린 파일을 식별하는 데 사용됩니다. 프로세스가 파일을 열면, 운영체제는 해당 파일에 대한 파일 디스크립터를 생성하고, 이를 통해 프로세스가 파일에 접근할 수 있게 합니다.
    • 파일 디스크립터는 정수 값으로, 운영체제는 이를 통해 열린 파일에 대한 메타데이터(파일의 위치, 상태 등)를 추적합니다.
  2. 입출력 연산 관리
    • 파일 디스크립터는 파일과의 입출력(Read/Write) 작업에 사용됩니다.
    • 예를 들어, read()write() 같은 시스템 호출은 파일 디스크립터를 사용하여 어떤 파일을 읽거나 쓸지 지정합니다.
    int fd = open("file.txt", O_RDONLY); // 파일 열기
    read(fd, buffer, sizeof(buffer));    // 파일 읽기
    close(fd);                           // 파일 닫기
    
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>    // open, close
#include <unistd.h>   // read, write
#include <string.h>   // strlen

#define FILENAME "example.txt"
#define BUFFER_SIZE 100

int main() {
    // 파일 디스크립터
    int fd;
    char *text = "Hello, World!\\n";
    char buffer[BUFFER_SIZE];

    // 파일 쓰기
    // O_WRONLY: 쓰기 전용, O_CREAT: 파일이 없으면 생성, O_TRUNC: 기존 파일 내용을 모두 지움
    fd = open(FILENAME, O_WRONLY | O_CREAT | O_TRUNC, 0644);
    if (fd < 0) {
        perror("Error opening file for writing");
        return EXIT_FAILURE;
    }

    // 파일에 문자열 쓰기
    ssize_t bytes_written = write(fd, text, strlen(text));
    if (bytes_written < 0) {
        perror("Error writing to file");
        close(fd);
        return EXIT_FAILURE;
    }

    // 파일 닫기
    close(fd);
    printf("Successfully wrote %zd bytes to %s\\n", bytes_written, FILENAME);

    // 파일 읽기
    // O_RDONLY: 읽기 전용
    fd = open(FILENAME, O_RDONLY);
    if (fd < 0) {
        perror("Error opening file for reading");
        return EXIT_FAILURE;
    }

    // 파일에서 문자열 읽기
    ssize_t bytes_read = read(fd, buffer, BUFFER_SIZE - 1);
    if (bytes_read < 0) {
        perror("Error reading from file");
        close(fd);
        return EXIT_FAILURE;
    }

    // 읽은 데이터에 널 종료 문자 추가
    buffer[bytes_read] = '\\0';

    // 파일 닫기
    close(fd);

    // 읽은 내용 출력
    printf("Read %zd bytes from %s: %s", bytes_read, FILENAME, buffer);

    return EXIT_SUCCESS;
}