Posix I/O system calls 함수 정리

붉을 혁 ,참 진·2024년 3월 30일
0

운영체제

목록 보기
1/3

→ Posix: Portable Operating System Interface

  • UNIX 운영 체제에서 파일 시스템 및 프로세스 제어를 위한 API를 정의하는 표준이다.

→ File Descriptor

UNIX 및 UNIX-like 운영 체제에서 파일을 식별하고 접근하기 위한 정수형 식별자이다. file descriptor은 프로세스가 파일을 열거나 생성할 때 커널이 할당해 주는 고유한 식별자이다. 일반적으로는 정수값으로 표현되며 0 (표준입력), 1 (표준출력), 2(표준 에러)와 같은 의미를 가진다. 하지만 일반적으로 0,1,2 index는 std-in/std-out/error와 관련된 fd로 미리 할당되고 보통 open()을 호출하면 3을 리턴받게 된다.

→ Open file description

unix 및 unix-like 운영 체제에서 파일에 대한 메타데이터 및 상태정보를 저장하는 내부 데이터 구조이다. 파일이 열릴 때 커널에 의해 생성 되며, 해당 파일에 대한 정보를 추적하고 관리하는데 사용된다. Open file description은 다음과 같은 정보가 포함될 수 있다. Open file description은 파일을 참조하는 file descritor과 연결되어 있으며, 이를 통해 파일을 식별하고 조작할 수 있다. Open file description은 프로세스의 file table에 저장되어 있으며, 해당 파일을 다루는 데 필요한 정보들을 제공한다.

  1. 파일 상태: 파일의 현재 상태를 나타내는 플래그. ex) 읽기 전용, 쓰기전용
  2. 파일 오프셋: 파일 내 현재 읽거나 쓰고 있는 위치를 나타낸다. 오프셋 값을 조작하며 파일을 읽고 쓸 위치를 제어할 수 있다.
  3. 파일 권한 및 모드: 파일의 소유자, 그룹, 권한등을 나타낸다.
  4. 기타 메타데이터

File Table: 커널이 관리하는 모든 열려진 테이블이다

Posix I/O 시스템 호출의 주요 목적

  1. 파일 조작: 열고 닫으며, 읽고 쓰는 등의 파일 조장을 수행한다.
  2. 파일 디스크립터 관리: 파일 디스크립터를 생성하고, 복제하며, 닫는 등의 관리를 수행한다.
  3. 파일 오프셋 조작: 파일 내의 오프셋을 이동하여 파일을 읽거나 쓸 위치를 지정한다.
  4. 파일 상태 확인: 파일의 상태를 확인하여 파일의 크기, 권한 등의 정보를 가져온다.

1.int open (const char *pathname, int flags, [mode_tmode]);

⇒ open() 함수는 file과 file descriptor간의 연결을 설정한다. 이 함수는 파일을 참조하는 open file description과 그 description을 참조하는 file descriptor을 생성하다. file descriptor은 다른 I/O 함수에서 해당 파일을 참조하는 데 사용된다.

  • ‘pathname’: 열고자 하는 파일의 경로를 나타내는 문자열이다.

    • ‘flags’: 파일을 열 때의 동작을 지정하는 플래그이다. ex) 읽기
    • ‘mode’: 파일의 권한을 지정하는 값이다. 사용자, 그룹 및, 기타 사용자의 권한을 지정한다. 파일을 처음 생성할 때만 사용된다.
    fcntl.h에 정의된 flag 상수 값
    O_RDONLY읽기 전용으로 열기
    O_WRONLY쓰기 전용으로 열기
    O_RDWR읽기 및 쓰기 모드로 열기
    O_CREAT파일이 존재하지 않으면 새로운 파일 생성하기
    O_TRUNC파일을 열 때 기존 파일의 내용을 지우기
    #include <fcntl.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    
    int main() {
        // 파일 경로
        const char *file_path = "example.txt";
    
        // 파일을 읽기 전용으로 열기
        int fd = open(file_path, O_RDONLY);
    
        if (fd == -1) {
            perror("open");
            exit(EXIT_FAILURE);
        }
    
        // 파일 디스크립터 출력
        printf("File descriptor: %d\n", fd);
    
        // 파일을 읽기 전용으로 열었으므로 파일 내용을 읽을 수 있음
        // 이후에는 파일을 다루는 작업을 수행할 수 있음
    
        // 파일을 닫음
        if (close(fd) == -1) { //파일을 닫는 동시에 에러가 나는지 확인한다.
            perror("close");
            exit(EXIT_FAILURE);
        }
    
        return 0;
    }
    
  1. int close(int fd);

    ⇒ 파일을 닫을 때 사용된다. 반환 값이 -1이면 파일을 닫는 도중 에러가 발생했음을 의미한다.

  2. ssize_t read(int fd, void *buf, size_t count);

    ⇒ file descriptor가 가리키는 파일에서 데이터를 읽어오는 역할을 한다.

    • ‘fd’: 읽을 파일을 가리키는 file descriptor이다.
    • ‘buf’: 읽은 데이터를 저장할 버퍼의 포인터이다. 읽은 데이터는 이 버퍼에 저장된다.
    • ‘count’: 읽을 데이터의 바이트 수 이다. 버퍼의 크기나 읽을 데이터의 크기를 지정한다.

    → 만약 에러가 발생하면 -1을 반환하고, 더 이상 읽을 데이터가 없으면 0을 반환한다.

    → 만약 데이터 읽기에 성공하였으면, 읽어온 데이터의 크기를 반환한다.

    → tip. ssize_t는 signed size type의 약자, 부호있는 정수형의 크기를 나타냄.

    #include <stdio.h>
    #include <stdlib.h>
    #include <fcntl.h>
    #include <unistd.h>
    
    #define BUFFER_SIZE 1024
    
    int main() {
        int fd;
        ssize_t bytes_read;
        char buffer[BUFFER_SIZE];
    
        // 파일 열기
        fd = open("example.txt", O_RDONLY);
        if (fd == -1) {
            perror("open");
            exit(EXIT_FAILURE);
        }
    
        // 파일에서 데이터 읽기
        bytes_read = read(fd, buffer, BUFFER_SIZE);
        if (bytes_read == -1) {
            perror("read");
            exit(EXIT_FAILURE);
        }
    
        // 읽은 데이터 출력
        printf("Read %zd bytes: %s\n", bytes_read, buffer);
    
        // 파일 닫기
        if (close(fd) == -1) {
            perror("close");
            exit(EXIT_FAILURE);
        }
    
        return 0;
    }
    
  3. ssize_t write(int fd, const void * but, size_t count);

    #include <stdio.h>
    #include <stdlib.h>
    #include <fcntl.h>
    #include <unistd.h>
    #include <string.h>
    
    int main() {
        int fd;
        ssize_t bytes_written;
        const char *data = "Hello, world!\n";
    
        // 파일 열기
        fd = open("output.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);
        if (fd == -1) {
            perror("open");
            exit(EXIT_FAILURE);
        }
    
        // 파일에 데이터 쓰기
        bytes_written = write(fd, data, strlen(data));
        if (bytes_written == -1) {
            perror("write");
            exit(EXIT_FAILURE);
        }
    
        // 파일 닫기
        if (close(fd) == -1) {
            perror("close");
            exit(EXIT_FAILURE);
        }
    
        return 0;
    }
    
profile
컴퓨터공학/경영 전공생 :)

0개의 댓글

관련 채용 정보