파일 디스크립터

  • 파일 디스크립터(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;
}

'Interview > OS' 카테고리의 다른 글

Linux OS inode  (1) 2024.09.26
Linux OS File System  (0) 2024.09.26
Linux OS fork  (0) 2024.09.26
Heap 영역 메모리 동적 할당 내부 로직  (1) 2024.09.26
OS 프로세스 데이터 영역  (0) 2024.09.26
김 정출