C의 파일 디스크립터
이 기사에서는 C 프로그래밍 언어의 파일 디스크립터에 대해 설명합니다.
파일 설명자 개요
파일 디스크립터는 고유한 방식으로 컴퓨터의 운영 체제에서 열려 있는 파일을 식별하는 데 사용할 수 있는 번호입니다. 데이터 리소스 및 액세스하는 데 사용할 수 있는 방법을 설명합니다.
파일 디스크립터는 파일에 액세스하기 위해 열기
, 닫기
, 읽기
및 쓰기
와 같은 여러 가지 방법을 제공합니다. 파일 디스크립터는 가장 기본적인 형태의 정수입니다.
열린 각 파일은 번호를 받습니다. 파일 설명자라고 합니다.
파일 디스크립터는 파일을 여는 데 사용된 후 open()
함수에 의해 반환되는 것입니다. 완료되면 이 파일 설명자를 활용하여 해당 파일에 대해 더 많은 작업을 수행할 수 있습니다.
예를 들어 열린 파일에서 데이터를 읽으려면 파일 설명자를 데이터를 읽는 함수의 입력으로 제공합니다.
파일 테이블 항목: 프로세스가 파일 열기를 요청할 때 파일 테이블 항목은 열린 파일에 대한 프록시 역할을 하는 메모리 구조로 형성됩니다. 이러한 항목은 파일 위치 유지를 담당합니다.
C 프로그래밍 언어의 파일 설명자
표준 입력(STDIN
), 표준 출력(STDOUT
) 및 표준 오류(STDERR
)는 Unix와 유사한 운영 체제에서 기본적으로 사용되는 처음 세 개의 파일 설명자입니다.
프로세스가 시작되면 해당 프로세스의 파일 디스크립터 테이블이 fd
(파일 디스크립터) 0
, 1
및 2
항목과 함께 자동으로 열립니다. 이 세 가지 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.txt
는 open
기능에 대한 첫 번째 입력으로 전송됩니다.
이것은 저장되는 파일의 실제 이름입니다. 다음으로 O_RDONLY
를 사용해야 한다고 표시했습니다.
이는 파일을 읽기 전용 모드로 열려고 함을 나타냅니다. 또한 파일이 존재하지 않는 경우 O_CREAT
를 사용하여 파일을 생성해야 합니다.
다음은 우리가 활용할 수 있는 몇 가지 다른 주장입니다.
O_WRONLY
: 쓰기만 가능하도록 파일을 엽니다.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
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