"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 파일 설명자 및 시스템 I/O를 처리하는 방법을 알아보려면 다음 줄 프로젝트를 확인하세요.

파일 설명자 및 시스템 I/O를 처리하는 방법을 알아보려면 다음 줄 프로젝트를 확인하세요.

2024-11-07에 게시됨
검색:547

C 프로그래밍 영역에서는 입력, 출력 및 메모리를 효과적으로 관리하는 것이 기본입니다. 이러한 중요한 개념을 이해하는 데 도움이 되도록 get_next_line은 파일 설명자를 사용하여 파일을 한 줄씩 읽는 함수를 작성하는 프로젝트입니다. 함수를 호출할 때마다 파일의 다음 줄을 읽으므로 전체 파일 내용을 한 번에 한 줄씩 처리할 수 있습니다.

시스템의 파일 설명자 및 I/O 이해

파일 설명자란 무엇입니까?

파일 설명자는 시스템에서 열려 있는 파일을 고유하게 식별하는 음수가 아닌 정수입니다. 프로그램이 파일을 열면 운영 체제는 파일 읽기, 쓰기 또는 닫기와 같은 후속 작업에서 해당 파일을 참조하는 데 사용할 수 있는 파일 설명자를 반환합니다. 파일 설명자는 파일, 소켓 및 파이프를 포함한 다양한 I/O 리소스를 관리하기 위해 운영 체제에서 사용하는 추상화입니다.

프로세스 A의 0, 1, 2(표준 입력, 표준 출력 및 표준 오류)는 독립적이며 프로세스 B의 파일 설명자와 별개입니다. 이렇게 격리하면 한 프로세스의 파일 작업이 다른 프로세스의 작업을 방해하지 않습니다. 또 다른.

파일 설명자 테이블

GET NEXT LINE A Project TO Learn How To Deal with File Descriptors and I/O of System

각 파일 설명자는 파일에 대한 필수 정보가 포함된 파일 설명자 테이블 항목과 연결됩니다. 여기에는 파일 경로, 액세스 권한 및 읽기/쓰기 작업을 위해 파일 내 위치를 추적하는 현재 오프셋이 포함됩니다. 이 구조를 통해 운영 체제는 열려 있는 여러 파일을 효율적으로 관리하고 올바른 액세스와 데이터 조작을 보장할 수 있습니다.

파일 설명자 0, 1, 2는 운영 체제에서 표준 스트림용으로 예약되어 있습니다. 파일 설명자 0은 일반적으로 키보드 입력을 나타내는 표준 입력(stdin)에 사용됩니다. 파일 설명자 1은 화면이나 터미널에 대한 출력을 나타내는 표준 출력(stdout)에 사용됩니다. 파일 설명자 2는 표준 오류(stderr)에 사용됩니다. 이는 화면이나 터미널에 대한 출력도 나타내지만 특히 오류 메시지용으로 사용됩니다. 이러한 예약된 파일 설명자는 기본 입력 및 출력 작업이 다양한 프로그램 및 환경에서 일관되게 관리될 수 있도록 보장합니다. open 함수에 의해 반환되는 모든 파일 설명자는 3 이상이므로 이러한 표준 스트림과 충돌하지 않습니다.

파일을 여는 방법


'#include '
'#include '

int fd = open("example.txt", O_RDONLY);
if (fd == -1) {
perror("Error opening file");
return 1;
}




코드 분석

정수로 표시되는 파일 설명자는 파일 이름(또는 경로)과 파일의 액세스 권한을 결정하는 플래그라는 두 가지 매개변수를 사용하는 open 함수를 사용하여 얻습니다. 예를 들어, 파일 내용을 읽으려면 O_RDONLY 플래그(읽기 전용)를 사용합니다. 읽고 쓰려면 O_RDWR 플래그를 사용합니다. 사용할 수 있는 플래그가 많지만 이 프로젝트에서는 O_RDONLY만 사용하겠습니다. open 함수는 음이 아닌 정수를 반환하는데, 이는 작업이 성공할 경우 파일 설명자입니다. 그렇지 않으면 -1을 반환하여 오류를 나타냅니다(example.txt에 액세스할 수 있는 권한이 없습니다). open 함수는 unistd.h 라이브러리에 있고 권한 플래그는 fcntl.h.

에 정의되어 있습니다.

파일 설명자에서 읽기


'#include '
'#include '
'#include '
'#define BUFFER_SIZE 4'

int fd = open("example.txt", O_RDONLY);
if (fd == -1) {
perror("Error opening file");
return 1;
}
char buffer[BUFFER_SIZE];
read(fd, buffer, sizeof(buffer)-1);
printf("1st call : %s\n", buffer);
// prints the first 3 bytes
read(fd, buffer, sizeof(buffer)-1);
printf("2nd call : %s\n", buffer);
read(fd, buffer, sizeof(buffer)-1);
printf("3rd call : %s\n", buffer);
read(fd, buffer, sizeof(buffer)-1);
printf("4th call : %s\n", buffer);
read(fd, buffer, sizeof(buffer)-1);
printf("5th call : %s\n", buffer);




고장

코드 결과

첫 번째 호출 : HEL
두 번째 호출 : LO
세 번째 호출 : WOR
네번째 호출 : LD
5번째 호출 : (null)

unistd.h 라이브러리에서 제공하는 읽기 기능은 파일 설명자에서 데이터를 읽는 데 사용됩니다. 세 가지 매개변수, 즉 파일 설명자, 읽은 데이터를 저장할 버퍼, 파일에서 읽을 바이트 수를 사용하며, read 함수는 파일에서 읽은 바이트 수를 반환합니다.

파일 설명자 테이블에는 오프셋이라는 속성이 있습니다. 오프셋은 파일 내의 현재 위치를 추적합니다. 읽기 함수가 호출될 때마다 현재 오프셋부터 시작하여 데이터를 읽은 다음 읽은 바이트 수만큼 오프셋을 전진시킵니다. 이렇게 하면 마지막 읽기가 중단된 지점부터 후속 읽기가 계속됩니다.

GET NEXT LINE A Project TO Learn How To Deal with File Descriptors and I/O of System

예제에서:

  • read에 대한 첫 번째 호출은 파일에서 처음 3바이트를 읽고 파일의 시작 부분(오프셋 0)에서 시작하여 버퍼에 저장합니다. 그런 다음 오프셋이 3으로 업데이트됩니다.
  • read에 대한 두 번째 호출은 업데이트된 오프셋(3)에서 시작하여 다음 3바이트를 읽은 다음 오프셋을 6으로 업데이트합니다.
    등 ...

  • 읽기 버퍼에 대한 다섯 번째 호출은 null이 되며 읽기는 파일 끝을 나타내는 0을 반환합니다.

이 프로세스는 파일에서 모든 데이터를 읽거나 오류가 발생할 때까지 계속됩니다. 버퍼는 문자열로 인쇄될 수 있도록 각 읽기 후에 null로 종료됩니다.

문제

char *get_next_line(int fd)는 파일의 파일 설명자를 매개변수로 취하고 각 호출에 대해 한 줄을 반환합니다. 파일의 끝에 도달하면 NULL을 반환합니다.

매개변수

  • fd: 읽을 파일의 파일 설명자.
  • BUFFER_SIZE: 파일에서 청크를 읽는 데 사용되는 버퍼의 크기입니다. 프로그램에 누출이 없어야 합니다.

해결책 :

https://github.com/Its-JoeTheKing/get_next_line

릴리스 선언문 이 기사는 https://dev.to/aerrfig/get-next-line-a-42-project-to-learn-how-to-deal-with-file-descriptors-and-io-of-에서 재현됩니다. system- 3652 침해 내용이 있는 경우, [email protected]으로 연락하여 삭제해 주시기 바랍니다.
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3