NAME

basename, dirname - 경로명 구성 요소 파싱하기

SYNOPSIS

#include <libgen.h>

char *dirname(char *path);
char *basename(char *path);

DESCRIPTION

주의: 두 가지 다른 basename() 함수가 있다. 아래 참고.

dirname()basename() 함수는 널로 끝나는 경로명 문자열을 디렉터리 부분과 파일명 부분으로 나눈다. 보통 경우에 dirname()은 마지막 '/' 전까지의 문자열을 반환하고 basename()은 그 마지막 '/' 다음 부분을 반환한다. 끝에 붙은 '/' 문자는 경로명에 포함시키지 않는다.

path 내에 슬래시가 없으면 dirname()은 문자열 "."을 반환하고 basename()path의 사본을 반환한다. path가 문자열 "/"이면 dirname()basename() 모두 문자열 "/"를 반환한다. path가 널 포인터거나 빈 문자열의 포인터면 dirname()basename() 모두 문자열 "."를 반환한다.

dirname()의 반환 문자열, "/", basename()의 반환 문자열을 이어 붙이면 완전한 경로명이 나온다.

dirname()basename()에서 path의 내용을 변경할 수도 있으므로 이 함수들을 호출할 때 사본을 전달하는 게 바람직할 수 있다.

이 함수들이 정적으로 할당한 메모리의 포인터를 반환할 수 있고 이어지는 호출에서 그 메모리를 덮어 쓸 수도 있다. 또는 path의 일부분에 대한 포인터를 반환할 수도 있으며, 따라서 함수가 반환한 포인터가 더는 필요치 않게 될 때까지는 path를 변경하거나 해제하지 말아야 한다.

(SUSv2에서 가져온) 다음 예시 목록은 여러 경로에 대해 dirname()basename()이 반환하는 문자열을 보여 준다.

경로 dirname basename
/usr/lib /usr lib
/usr/ / usr
usr . usr
/ / /
. . .
.. . ..

RETURN VALUE

dirname()basename() 모두 널 종료 문자열의 포인터를 반환한다. (이 포인터를 free(3)로 전달해선 안 된다.)

ATTRIBUTES

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

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

CONFORMING TO

POSIX.1-2001, POSIX.1-2008.

NOTES

두 가지 다른 basename() 버전이 있다. 위에서 기술한 POSIX 버전, 그리고 다음처럼 얻는 GNU 버전이다.

#define _GNU_SOURCE         /* feature_test_macros(7) 참고 */
#include <string.h>

GNU 버전에서는 절대 인자를 변경하지 않으며 path 끝에 슬래시가 있을 때, 특히 path가 "/"일 때도 빈 문자열을 반환한다. dirname()의 GNU 버전은 없다.

glibc에서는 <libgen.h>를 포함시키면 POSIX 버전 basename()을 얻고 아니면 GNU 버전을 얻는다.

BUGS

glibc 구현에서 이 함수들의 POSIX 버전이 path 인자를 변경하므로 "/usr/" 같은 정적 문자열로 호출 시 세그먼테이션 폴트가 발생한다.

glibc 2.2.1 전에서 dirname()의 glibc 버전이 끝에 '/' 문자가 있는 경로명을 올바로 처리하지 못했으며 NULL 인자를 주면 세그먼테이션 폴트가 발생했다.

EXAMPLES

다음 코드 조각은 basename()dirname() 사용 방식을 보여 준다.

char *dirc, *basec, *bname, *dname;
char *path = "/etc/passwd";

dirc = strdup(path);
basec = strdup(path);
dname = dirname(dirc);
bname = basename(basec);
printf("dirname=%s, basename=%s\n", dname, bname);

SEE ALSO

basename(1), dirname(1)


2021-03-22