C의 파일 디스크립터

Waqar Aslam 2023년10월12일
  1. 파일 설명자 개요
  2. C 프로그래밍 언어의 파일 설명자
  3. C에서 파일 디스크립터를 사용하는 시스템 호출
C의 파일 디스크립터

이 기사에서는 C 프로그래밍 언어의 파일 디스크립터에 대해 설명합니다.

파일 설명자 개요

파일 디스크립터는 고유한 방식으로 컴퓨터의 운영 체제에서 열려 있는 파일을 식별하는 데 사용할 수 있는 번호입니다. 데이터 리소스 및 액세스하는 데 사용할 수 있는 방법을 설명합니다.

파일 디스크립터는 파일에 액세스하기 위해 열기, 닫기, 읽기쓰기와 같은 여러 가지 방법을 제공합니다. 파일 디스크립터는 가장 기본적인 형태의 정수입니다.

열린 각 파일은 번호를 받습니다. 파일 설명자라고 합니다.

파일 디스크립터는 파일을 여는 데 사용된 후 open() 함수에 의해 반환되는 것입니다. 완료되면 이 파일 설명자를 활용하여 해당 파일에 대해 더 많은 작업을 수행할 수 있습니다.

예를 들어 열린 파일에서 데이터를 읽으려면 파일 설명자를 데이터를 읽는 함수의 입력으로 제공합니다.

파일 테이블 항목: 프로세스가 파일 열기를 요청할 때 파일 테이블 항목은 열린 파일에 대한 프록시 역할을 하는 메모리 구조로 형성됩니다. 이러한 항목은 파일 위치 유지를 담당합니다.

C 프로그래밍 언어의 파일 설명자

표준 입력(STDIN), 표준 출력(STDOUT) 및 표준 오류(STDERR)는 Unix와 유사한 운영 체제에서 기본적으로 사용되는 처음 세 개의 파일 설명자입니다.

프로세스가 시작되면 해당 프로세스의 파일 디스크립터 테이블이 fd(파일 디스크립터) 0, 12 항목과 함께 자동으로 열립니다. 이 세 가지 fd 각각은 /dev/tty라는 파일에 대한 파일 테이블의 항목을 참조합니다.

이름 파일 설명자 설명
stdin 0 표준 입력
stdout 1 표준 출력
stderr 2 표준 에러

C에서 파일 디스크립터를 사용하는 시스템 호출

시스템 호출은 운영 체제가 응용 프로그램 프로그래밍 인터페이스(API)를 통해 사용자 응용 프로그램에 액세스할 수 있는 서비스를 만드는 방법입니다.

다음 유형의 I/O 시스템 호출이 이 컨텍스트에서 사용됩니다.

파일 설명자를 사용하여 open() 호출

열려는 파일의 이름이 이 메서드의 첫 번째 매개변수로 전송됩니다. 그런 다음 열기 모드를 결정하는 몇 가지 추가 옵션을 제공합니다.

파일을 열 수 없는 경우 반환 값은 -1로 설정됩니다. 따라서 열린 파일에서 더 이상의 작업을 수행하기 전에 open() 메서드에서 반환된 값을 확인해야 합니다.

값이 -1인 경우 open() 메서드가 파일을 성공적으로 열 수 없다는 것을 알고 있습니다.

open() 호출을 구현하는 예를 들어 보겠습니다.

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

int main(int argc, char const *argv[]) {
  int fileDescriptor;
  char buff[1000];

  if ((fileDescriptor = open("abc.txt", O_CREAT | O_RDONLY)) == -1) {
    printf("File Open Failed\n");
    exit(0);
  } else {
    printf("File Opened Successfully\n");
    printf("File Descriptor: %d\n", fileDescriptor);
  }
}

출력:

File Opened Successfully
File Descriptor: 3

fileDescriptor라는 이름의 정수 변수는 main 함수의 맨 처음에 정의되었습니다. 이것은 파일 디스크립터의 값을 저장하는 데 사용됩니다.

그런 다음 if 문을 사용하여 open 함수가 반환한 값을 테스트했습니다. -1인 경우 애플리케이션을 종료하고 오류 메시지를 표시합니다.

그렇지 않은 경우 프로그램을 계속 진행할 수 있습니다. 문자열 abc.txtopen 기능에 대한 첫 번째 입력으로 전송됩니다.

이것은 저장되는 파일의 실제 이름입니다. 다음으로 O_RDONLY를 사용해야 한다고 표시했습니다.

이는 파일을 읽기 전용 모드로 열려고 함을 나타냅니다. 또한 파일이 존재하지 않는 경우 O_CREAT를 사용하여 파일을 생성해야 합니다.

다음은 우리가 활용할 수 있는 몇 가지 다른 주장입니다.

  1. O_WRONLY: 쓰기만 가능하도록 파일을 엽니다.
  2. O_RDWR: 이 옵션을 사용하면 파일을 동시에 열어 읽고 쓸 수 있습니다.

파일 설명자를 사용하여 close() 호출

파일 시스템에 대한 액세스가 종료되도록 수행됩니다. 프로그램이 이 시스템 기능을 호출하면 더 이상 파일이 필요하지 않음을 나타냅니다.

결과적으로 버퍼가 플러시되고 파일 정보가 수정되며 파일과 관련된 리소스가 할당 해제됩니다.

int close(int fd);

파일 설명자를 사용하여 read() 호출

파일 설명자는 수락하는 첫 번째 매개변수입니다. 인수로 파일을 열 때 사용된 설명자를 제공해야 합니다.

포인터는 두 번째 매개변수로 전송됩니다. 읽기 기능은 지정된 파일에서 데이터를 가져와 지시한 위치에 저장합니다.

이 포인터의 값으로 이전에 할당된 버퍼 영역의 주소를 제공할 수 있습니다. 세 번째 매개변수는 파일에서 읽어야 하는 바이트 수를 지정합니다.

파일을 성공적으로 읽은 경우 이 파일에서 성공적으로 읽은 바이트 수가 이 파일에 의해 반환됩니다. 성공하지 못하면 -1 값을 반환합니다.

통사론:

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

파일 디스크립터를 사용하여 파일을 읽는 예는 다음과 같습니다.

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

int main(int argc, char const *argv[]) {
  int fileDescriptor;
  char buff[1000];

  if ((fileDescriptor = open("abc.txt", O_RDONLY)) == -1) {
    printf("File Opening Failed\n");
    exit(0);
  } else {
    printf("File Opened Successfully\n");
    printf("File Descriptor: %d\n", fileDescriptor);

    if (read(fileDescriptor, buff, sizeof(buff)) == -1) {
      printf("Error while reading file\n");
      exit(0);
    } else {
      printf("Text of the File: %s\n", buff);
    }
  }
  return 0;
}

출력:

File Opened Successfully
File Descriptor: 3
Text of the File: DelftStack has the solutions to all the programming-related problems
작가: Waqar Aslam
Waqar Aslam avatar Waqar Aslam avatar

I am Waqar having 5+ years of software engineering experience. I have been in the industry as a javascript web and mobile developer for 3 years working with multiple frameworks such as nodejs, react js, react native, Ionic, and angular js. After which I Switched to flutter mobile development. I have 2 years of experience building android and ios apps with flutter. For the backend, I have experience with rest APIs, Aws, and firebase. I have also written articles related to problem-solving and best practices in C, C++, Javascript, C#, and power shell.

LinkedIn

관련 문장 - C File