C++에서 realpath() 함수 구현

Jay Shaw 2023년10월12일
  1. C++에서 realpath() 함수 구현
  2. C++에서 realpath() 함수를 사용하여 절대 경로 찾기
  3. 한 줄 명령을 사용하여 C++에서 realpath() 함수를 사용하여 절대 경로 찾기
  4. 결론
C++에서 realpath() 함수 구현

realpath() 함수는 POSIX 1997POSIX 2008에서 디렉터리 내부 파일의 절대 경로를 찾는 함수로 처음 문서화되었습니다.

이 기사에서는 C++에서 realpath() 함수의 구현에 대해 설명합니다. C++를 사용하여 파일의 절대 경로를 찾기 위해 시스템에 구현할 수 있습니다.

C++에서 realpath() 함수 구현

C++에서 realpath()의 주요 용도는 모든 심볼릭 링크가 확인될 때 파일의 경로 이름을 찾는 것입니다.

C++에서 realpath() 구현에 대해 논의하기 전에 알아야 할 몇 가지 기본 개념은 다음과 같습니다.

  • 심볼릭 링크: 심볼릭 링크는 대상 파일을 가리키지만 컴퓨터가 심볼릭 링크를 대상 파일에 대한 링크가 아닌 자체 파일로 취급하므로 바로 가기와는 다릅니다. 이것은 액세스할 때 사용자를 원본 파일이 있는 위치로 안내하는 파일 유형의 역할을 하며 심볼릭 링크에 대한 모든 변경 사항도 원본 파일에 반영됩니다.
  • 절대 경로: 파일의 경로가 \usr\bin\main과 같이 루트 디렉터리까지 기록될 때 이를 절대 경로라고 합니다.
  • 상대 경로: 현재 작업 디렉토리가 usr\bin으로 설정되어 있으면 절대 경로가 /usr/bin/main인 파일을 단순히 main으로 참조할 수 있습니다. 예를 들어 UNIX 명령: cp /usr/bin/main /usr/bin/main.bak 및 명령: cp mailbox mailbox.bak는 작업 디렉토리가 /usr/ast인 경우 동일한 작업을 수행합니다.

C++에서 realpath() 함수가 찾은 경로 이름은 제공된 값이 상대 이름인 경우 반드시 절대적일 필요는 없지만 링크 값에 대한 절대 이름으로 심볼릭 링크를 순회하는지 여부에 따라 달라집니다. 그렇다면 출력은 절대 이름입니다.

C++에서 realpath() 함수를 사용하여 절대 경로 찾기

C++에서 realpath()를 사용하여 파일의 절대 경로를 찾는 프로그램을 만들어 봅시다. 이 예제는 Linux에서 시연됩니다(Windows에서는 구분 기호가 \임).

  1. .cpp 확장자가 있는 Linux 배포판에서 텍스트 편집기를 엽니다.

  2. 프로그램에는 5개의 가져오기 파일이 있습니다. limits.hPATH_MAX 하위 기능을 포함하고, stdio는 입력-출력 기능을, stdlib, string은 문자열 기능을, cerrno는 오류 사례를 포함합니다. .

  3. main 함수 내에서 변수가 생성됩니다. 즉, 크기가 PATH_MAX로 설정된 문자 배열 buffer[]입니다. PATH_MAX를 사용하는 것은 단순히 추측하는 대신 경로 이름을 저장하는 더 좋은 방법입니다.

  4. C++의 realpath()는 파일 이름과 확인된 이름의 두 가지 매개 변수를 사용합니다. 확인된 이름에 대한 포인터를 반환합니다. 그렇지 않으면 오류 플래그가 반환됩니다.

    char *path = realpath("test.py", buffer);
    
  5. C++에서 realpath() 함수에 의해 확인된 이름이 성공적으로 반환되면 buffer 변수 내부의 값이 인쇄됩니다.

    if (path) {
      printf("Absolute Path = %s.\n", buffer);
    }
    
  6. realpath() 함수가 널 포인터를 반환하면 프로그램은 errno 함수를 사용하여 오류 플래그를 발생시킵니다.

    char* errStr = strerror(errno);
    

    errno 함수는 cerrno 라이브러리의 멤버 함수입니다. 숫자 오류 코드를 반환하지만 strerror 함수를 사용하여 해당 문자열 값 char* errStr = strerror(errno)으로 변환합니다.

  7. perrorstder에 오류 메시지를 인쇄합니다. 이 함수는 먼저 중괄호 안에 제공된 텍스트를 인쇄한 다음 오류 메시지를 인쇄합니다.

    perror("realpath");
    
  8. 마지막으로 else 블록 내부의 EXIT_FAILURE 종료 코드를 사용하여 프로그램이 종료됩니다.

    exit(EXIT_FAILURE);
    

암호:

#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <cerrno>

int main(void) {
  char buffer[PATH_MAX];
  char* path = realpath("test.py", buffer);
  if (path) {  // or: if (path != NULL)
    printf("Absolute Path = %s.\n", buffer);
  } else {
    char* errStr = strerror(errno);
    printf("String Error: %s\n", errStr);

    perror("realpath");
    exit(EXIT_FAILURE);
  }
  return 0;
}

편집:

코드는 Linux로 작성되었으므로 터미널을 사용하여 컴파일해야 합니다. 적절한 이름(예: C-realpath)과 .cpp 확장자로 코드가 작성된 텍스트 파일을 저장합니다.

파일은 gcc 컴파일러를 사용하여 컴파일되고 코드를 실행하기 위해 새 애플리케이션이 생성됩니다.

아래 구문을 사용하십시오.

gcc -o realpath2 C-realpath.cpp

위 구문은 오류가 없는 한 코드를 성공적으로 컴파일합니다. 일단 컴파일되면 컴파일러는 코드에 대한 출력 애플리케이션인 realpath2를 생성합니다.

응용 프로그램을 실행하려면 다음 구문을 입력하십시오.

./realpath2

출력:

jay@jay-virtual-machine:~$ gcc -o realpath2 C-realpath.cpp
jay@jay-virtual-machine:~$ ./realpath2
Absolute Path = /home/jay/test.py.

파일 test.py가 시스템에 존재하므로 프로그램은 절대 경로를 인쇄합니다.

파일에 잘못된 이름이 제공되거나 파일이 누락된 경우 애플리케이션은 오류 코드를 인쇄합니다.

jay@jay-virtual-machine:~$ ./realpath2
String Error: No such file or directory
realpath: No such file or directory

한 줄 명령을 사용하여 C++에서 realpath() 함수를 사용하여 절대 경로 찾기

C++의 realpath() 함수는 Linux의 한 줄 명령으로도 구현할 수 있습니다. 이렇게 하면 프로그래머가 코드를 작성하고 별도로 컴파일하기 위해 텍스트 파일을 만들지 않아도 됩니다.

코드를 컴파일하려면 터미널 내부에 다음 구문을 작성하십시오.

gcc -o realpath -x c - <<< $'#include<stdlib.h>\n#include<stdio.h>\nint main(int c,char**v){puts(realpath(v[1],0));}'

코드의 기능:

  1. gcc -o realpathgcc 컴파일러를 사용하여 realpath 출력 애플리케이션을 생성합니다.
  2. 코드에는 stdlibstdio라는 두 개의 라이브러리 패키지가 있습니다.
  3. main 메서드 내에서 정수 변수 c와 포인터 v라는 두 개의 변수가 생성됩니다.
  4. puts(realpath(v[1],0))realpath() 함수에서 반환된 문자열 리터럴을 반환합니다.

출력을 생성하려면 출력 애플리케이션 realpath에 파일 이름 또는 경로를 제공해야 합니다. 이 예제에서는 파일 시스템 내의 폴더가 응용 프로그램에 전달되고 파일의 절대 경로를 반환합니다.

출력:

jay@jay-virtual-machine:~$ ./realpath snap
/home/jay/snap

코드 내부에 오류 예외가 없으므로 입력이 누락된 파일인 경우 오류가 발생합니다.

jay@jay-virtual-machine:~$ ./realpath vid
Segmentation fault (core dumped)

결론

이 기사에서는 C++에서 realpath() 함수를 구현하여 파일의 절대 경로를 찾는 방법을 설명합니다. 기사를 살펴본 후 독자는 C++에서 realpath()를 사용하여 파일의 절대 경로를 파생할 수 있습니다.