NAME

realpath - 정규화 된 절대 경로명 반환

SYNOPSIS

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

char *realpath(const char *restrict path,
               char *restrict resolved_path);

glibc 기능 확인 매크로 요건 (feature_test_macros(7) 참고):

realpath():
_XOPEN_SOURCE >= 500
|| /* glibc 2.19부터: */ _DEFAULT_SOURCE
|| /* glibc <= 2.19: */ _BSD_SOURCE

DESCRIPTION

realpath()는 널 종료 문자열 path에서 심볼릭 링크를 모두 확장하고 /./, /../, 중복 '/' 문자를 풀어서 정규화 된 절대 경로명을 만들어 낸다. 결과로 나온 경로명을 resolved_path가 가리키는 버퍼에 최대 PATH_MAX 바이트까지의 널 종료 문자열로 저장한다. 결과 경로에는 심볼릭 링크나 /./, /../ 요소가 없게 된다.

resolved_path를 NULL로 지정하면 realpath()에서 malloc(3)을 사용해 풀린 경로명을 담을 최대 PATH_MAX 바이트 버퍼를 할당하고 그 버퍼의 포인터를 반환한다. 호출자가 free(3)를 써서 그 버퍼를 해제해야 한다.

RETURN VALUE

오류가 없으면 realpath()resolved_path에 대한 포인터를 반환한다.

아니면 NULL을 반환하며 그때 배열 resolved_path의 내용은 규정돼 있지 않다. 그리고 오류를 나타내도록 errno를 설정한다.

ERRORS

EACCES
경로 선두부의 어느 요소에 대해 읽기 내지 탐색 권한이 거부되었다.
EINVAL
path가 NULL이다. (glibc 버전 2.3 전에서는 resolved_path가 NULL인 경우에도 이 오류를 반환한다.)
EIO
파일 시스템에서 읽기를 하는 동안 I/O 오류가 발생했다.
ELOOP
경로명을 변환하는 동안 너무 많은 심볼릭 링크를 만났다.
ENAMETOOLONG
경로명의 어느 요소가 NAME_MAX 글자를 넘었다. 또는 전체 경로명이 PATH_MAX 글자를 넘었다.
ENOENT
해당 파일이 존재하지 않는다.
ENOMEM
메모리 부족.
ENOTDIR
경로 선두부의 한 요소가 디렉터리가 아니다.

ATTRIBUTES

이 절에서 사용하는 용어들에 대한 설명은 attributes(7)를 보라.

인터페이스 속성
realpath() 스레드 안전성 MT-Safe

CONFORMING TO

4.4BSD, POSIX-1.2001.

POSIX.1-2001에서는 resolved_path가 NULL일 때의 동작을 구현에서 규정한다고 한다. POSIX.1-2008에서는 이 페이지에서 기술하는 동작 방식을 명세한다.

NOTES

4.4BSD와 솔라리스에서 경로명 길이 제한은 (<sys/param.h>에 있는) MAXPATHLEN이다. SUSv2에서는 <limits.h>에 있거나 pathconf(3) 함수로 얻을 수 있는 PATH_MAXNAME_MAX를 규정하고 있다. 일반적으로 소스가 다음과 같이 될 것이다.

#ifdef PATH_MAX
  path_max = PATH_MAX;
#else
  path_max = pathconf(path, _PC_PATH_MAX);
  if (path_max <= 0)
    path_max = 4096;
#endif

(하지만 BUGS 절 참고.)

GNU 확장

호출이 EACCESENOENT로 실패하고 resolved_path가 NULL이 아니면 읽기 가능하지 않거나 존재하지 않은 path의 선두부를 resolved_path로 반환한다.

BUGS

이 함수의 POSIX.1-2001 표준 버전에는 설계상 결함이 있다. 출력 버퍼 resolved_path에 적절한 크기를 결정하는 것이 불가능하기 때문이다. POSIX.1-2001에 따르면 PATH_MAX 크기의 버퍼로 충분하지만 PATH_MAX가 꼭 상수로 정의되어 있어야 하는 것이 아니고 pathconf(3)로 얻어야 할 수도 있다. 그런데 pathconf(3)에 묻는 것이 실제로 도움이 되지 않는 것이, 한편으로는 POSIX에서 pathconf(3)의 결과가 아주 커서 메모리 할당에 부적합할 수도 있다고 경고하고 있으며 또한 pathconf(3)PATH_MAX에 제한이 없음을 뜻하는 -1을 반환할 수도 있다. POSIX.1-2001에 표준화되어 있지 않지만 POSIX.1-2008에는 표준화되어 있는 resolved_path == NULL 기능을 통해 이 설계 문제를 피할 수 있다.

SEE ALSO

realpath(1), readlink(2), canonicalize_file_name(3), getcwd(3), pathconf(3), sysconf(3)


2021-03-22