basename(3) Library Functions Manual basename(3)
NAME
basename, dirname - parse pathname components
LIBRARY
Standard C library (libc, -lc)
SYNOPSIS
#include <libgen.h>
char *dirname(char *path);
char *basename(char *path);
DESCRIPTION
Warning: there are two different functions basename(); see below.
The functions dirname() and basename() break a null-terminated pathname
string into directory and filename components. In the usual case,
dirname() returns the string up to, but not including, the final '/',
and basename() returns the component following the final '/'. Trailing
'/' characters are not counted as part of the pathname.
If path does not contain a slash, dirname() returns the string "." while
basename() returns a copy of path. If path is the string "/", then both
dirname() and basename() return the string "/". If path is a null
pointer or points to an empty string, then both dirname() and basename()
return the string ".".
Concatenating the string returned by dirname(), a "/", and the string
returned by basename() yields a complete pathname.
Both dirname() and basename() may modify the contents of path, so it may
be desirable to pass a copy when calling one of these functions.
These functions may return pointers to statically allocated memory which
may be overwritten by subsequent calls. Alternatively, they may return
a pointer to some part of path, so that the string referred to by path
should not be modified or freed until the pointer returned by the func-
tion is no longer required.
The following list of examples (taken from SUSv2) shows the strings re-
turned by dirname() and basename() for different paths:
path dirname basename
/usr/lib /usr lib
/usr/ / usr
usr . usr
/ / /
. . .
.. . ..
RETURN VALUE
Both dirname() and basename() return pointers to null-terminated
strings. (Do not pass these pointers to free(3).)
ATTRIBUTES
For an explanation of the terms used in this section, see attributes(7).
┌────────────────────────────────────────────┬───────────────┬─────────┐
│ Interface │ Attribute │ Value │
├────────────────────────────────────────────┼───────────────┼─────────┤
│ basename(), dirname() │ Thread safety │ MT-Safe │
└────────────────────────────────────────────┴───────────────┴─────────┘
VERSIONS
There are two different versions of basename() - the POSIX version de-
scribed above, and the GNU version, which one gets after
#define _GNU_SOURCE /* See feature_test_macros(7) */
#include <string.h>
The GNU version never modifies its argument, and returns the empty
string when path has a trailing slash, and in particular also when it is
"/". There is no GNU version of dirname().
With glibc, one gets the POSIX version of basename() when <libgen.h> is
included, and the GNU version otherwise.
STANDARDS
POSIX.1-2008.
HISTORY
POSIX.1-2001.
BUGS
In the glibc implementation, the POSIX versions of these functions mod-
ify the path argument, and segfault when called with a static string
such as "/usr/".
Before glibc 2.2.1, the glibc version of dirname() did not correctly
handle pathnames with trailing '/' characters, and generated a segfault
if given a NULL argument.
EXAMPLES
The following code snippet demonstrates the use of basename() and
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)
Linux man-pages 6.9.1 2024-06-15 basename(3)
Generated by dwww version 1.16 on Tue Dec 16 04:40:26 CET 2025.