realpath - return the canonicalized absolute pathname
char *realpath(const char *path, char *resolved_path);
expands all symbolic links and resolves references
characters in the null terminated string named by
and stores the canonicalized absolute pathname in the buffer of size
The resulting path will have no symbolic link,
If there is no error, it returns a pointer to the
Otherwise it returns a NULL pointer, and the contents
of the array
are undefined. The global variable
is set to indicate the error.
Read or sear.h permission was denied for a component of the path prefix.
is NULL. (In libc5 this would just cause a segfault.)
An I/O error occurred while reading from the file system.
Too many symbolic links were encountered in translating the pathname.
A component of a path name exceeded
characters, or an entire path name exceeded
The named file does not exist.
A component of the path prefix is not a directory.
The libc4 and libc5 implementation contains a buffer overflow
(fixed in libc-5.4.13).
Thus, suid programs like mount need a private version.
The length of the output buffer should have been an additional
parameter, especially since
warns that the result of
may be huge and unsuitable for mallocing memory.
function first appeared in BSD 4.4, contributed by Jan-Simon Pendry.
In Linux this function appears in libc 4.5.21.
In BSD 4.4 and Solaris the limit on the pathname length is MAXPATHLEN
(found in <sys/param.h>). The SUSv2 prescribes PATH_MAX and
NAME_MAX, as found in <limits.h> or provided by the
function. A typical source fragment would be
path_max = PATH_MAX;
path_max = pathconf (path, _PC_PATH_MAX);
if (path_max <= 0)
path_max = 4096;
The BSD 4.4, Linux and SUSv2 versions always return an absolute
path name. Solaris may return a relative path name when the
argument is relative.
The prototype of
is given in <unistd.h> in libc4 and libc5,
but in <stdlib.h> everywhere else.
int main(int atgc, char *argv)