getcwd(3)
๐ getcwd(3) โ the "where am I rn" page ๐
okay bestie, welcome to the getcwd glow-up ๐ซถ this one lives in the Library Functions Manual (that's the manual name, iykyk) and it's literally just "tell me what folder I'm standing in." iconic behavior. let's go ๐ธ
โจ NAME โจ
getcwd, getwd, get_current_dir_name โ get current working directory ๐
๐ LIBRARY ๐
Standard C library (libc, -lc)
๐ SYNOPSIS ๐
#include <unistd.h>
char *getcwd(size_t size;
char buf[size], size_t size);
char *get_current_dir_name(void);
[[deprecated]] char *getwd(char buf[PATH_MAX]);
๐ง Feature Test Macro Requirements for glibc (peep feature_test_macros(7)) ๐ง
get_current_dir_name():_GNU_SOURCE
getwd():- Since glibc 2.12:
(_XOPEN_SOURCE >= 500) && ! (_POSIX_C_SOURCE >= 200809L)
- Since glibc 2.12:
|| /* glibc >= 2.19: */ _DEFAULT_SOURCE
|| /* glibc <= 2.19: */ _BSD_SOURCE
- Before glibc 2.12:
_BSD_SOURCE || _XOPEN_SOURCE >= 500
๐ DESCRIPTION ๐
These functions hand you a null-terminated string holding an absolute pathname that is the current working directory of the calling process. so basically "here's exactly where you are, queen." ๐
The pathname comes back two ways: as the function result, and through the argument buf โ but only if buf is actually there, mmkay.
getcwd() copies an absolute pathname of the current working directory into the array pointed to by buf, which is size long.
โ ๏ธ real talk: if the length of the absolute pathname of the current working directory, including the terminating null byte, exceedssizebytes,NULLgets returned anderrnois set toERANGE. an application should check for this error and allocate a bigger buffer if it needs to. do not skip this. do not be that girl. ๐
As an extension to the POSIX.1-2001 standard (glibc said "let me cook"), glibc's getcwd() allocates the buffer dynamically using malloc(3) if buf is NULL. In this case, the allocated buffer has the length size โ unless size is zero, and then buf is allocated as big as necessary, no cap fr. The caller should free(3) the returned buffer. ๐ซถ
get_current_dir_name() will malloc(3) an array big enough to hold the absolute pathname of the current working directory. If the environment variable PWD is set, and its value is correct, then that value will be returned โ she's efficient like that โจ. The caller should free(3) the returned buffer.
getwd() does not malloc(3) any memory. The buf argument should be a pointer to an array at least PATH_MAX bytes long. If the length of the absolute pathname of the current working directory, including the terminating null byte, exceeds PATH_MAX bytes, NULL is returned and errno is set to ENAMETOOLONG. (heads up: on some systems, PATH_MAX may not be a compile-time constant; and its value may even depend on the filesystem โ see pathconf(3).) For portability and security reasons, use of getwd() is deprecated. it's giving legacy. it's giving don't. ๐ซ
๐ซ RETURN VALUE ๐ซ
On success, these functions return a pointer to a string containing the pathname of the current working directory. In the case of getcwd() and getwd() this is the same value as buf. slay โจ
On failure, these functions return NULL, and errno is set to indicate the error. The contents of the array pointed to by buf are undefined on error โ like, we do not know her anymore, do not read her ๐.
๐ ERRORS ๐
EACCESโ Permission to read or search a component of the filename was denied. rude tbh.EFAULTโbufpoints to a bad address.EINVALโ Thesizeargument is zero andbufis not a null pointer.EINVALโgetwd():bufisNULL.ENAMETOOLONGโgetwd(): The size of the null-terminated absolute pathname string exceedsPATH_MAXbytes.ENOENTโ The current working directory has been unlinked. she's gone, bestie ๐ญENOMEMโ Out of memory. the vibes are bad.ERANGEโ Thesizeargument is less than the length of the absolute pathname of the working directory, including the terminating null byte. You need to allocate a bigger array and try again. bigger. array. periodt. ๐ฅ
๐ ATTRIBUTES ๐
For an explanation of the terms used in this section, see attributes(7). here's the table, but make it a list because we're cute like that:
- Interface
getcwd(),getwd()โ Attribute: Thread safety โ Value:MT-Safe - Interface
get_current_dir_name()โ Attribute: Thread safety โ Value:MT-Safe env
๐ VERSIONS ๐
POSIX.1-2001 leaves the behavior of getcwd() unspecified if buf is NULL.
POSIX.1-2001 does not define any errors for getwd().
๐ VERSIONS (again, but make it โจ C library/kernel differences โจ) ๐
๐ C library/kernel differences ๐
On Linux, the kernel provides a getcwd() system call, which the functions described in this page will use if possible. The system call takes the same arguments as the library function of the same name, but is limited to returning at most PATH_MAX bytes. (Before Linux 3.12, the limit on the size of the returned pathname was the system page size. On many architectures, PATH_MAX and the system page size are both 4096 bytes, but a few architectures have a larger page size.) If the length of the pathname of the current working directory exceeds this limit, then the system call fails with the error ENAMETOOLONG. In this case, the library functions fall back to a (slower) alternative implementation that returns the full pathname. she's resourceful ๐
Following a change in Linux 2.6.36, the pathname returned by the getcwd() system call will be prefixed with the string "(unreachable)" if the current directory is not below the root directory of the current process (e.g., because the process set a new filesystem root using chroot(2) without changing its current directory into the new root). Such behavior can also be caused by an unprivileged user by changing the current directory into another mount namespace. When dealing with pathnames from untrusted sources, callers of the functions described in this page (before glibc 2.27) or the raw getcwd() system call should consider checking whether the returned pathname starts with '/' or '(' to avoid misinterpreting an unreachable path as a relative pathname. ๐
โญ STANDARDS โญ
getcwd()โ POSIX.1-2008.get_current_dir_name()โ GNU.getwd()โ None.
๐ HISTORY ๐
getcwd()โ POSIX.1-2001.getwd()โ POSIX.1-2001, but marked LEGACY. Removed in POSIX.1-2008. Usegetcwd()instead. she's retired, let her rest ๐
Under Linux, these functions make use of the getcwd() system call (available since Linux 2.1.92). On older systems they would query /proc/self/cwd. If both system call and proc filesystem are missing, a generic implementation is called. Only in that case can these calls fail under Linux with EACCES.
๐ฆ NOTES ๐ฆ
These functions are often used to save the location of the current working directory for the purpose of returning to it later. Opening the current directory (".") and calling fchdir(2) to return is usually a faster and more reliable alternative when sufficiently many file descriptors are available โ especially on platforms other than Linux. save the bookmarks, bestie ๐
๐ BUGS ๐
Since the Linux 2.6.36 change that added "(unreachable)" in the circumstances described above, the glibc implementation of getcwd() has failed to conform to POSIX and returned a relative pathname when the API contract requires an absolute pathname. With glibc 2.27 onwards this is corrected; calling getcwd() from such a pathname will now result in failure with ENOENT. character development, honestly ๐
๐ซถ SEE ALSO ๐ซถ
pwd(1), chdir(2), fchdir(2), open(2), unlink(2), free(3), malloc(3)
and that's the whole page, bestie ๐ this one's from Linux man-pages 6.20, dated 2026-02-08 โ so if you ever need to know where you are, just remember: getcwd() ate and left no crumbs ๐โจ bye pookie ๐ซถ ๐
๐ฆ where this page comes from
- arch rolling: man-pages 6.20-1 ยท BSD-2-Clause AND BSD-3-Clause AND BSD-4.3TAHOE AND BSD-4-Clause-UC AND GPL-1.0-or-later AND GPL-2.0-only AND GPL-2.0-or-later AND GPL-3.0-or-later AND LGPL-3.0-linking-exception AND LGPL-3.0-or-later AND LicenseRef-Public-Domain AND LicenseRef-UltraPermissive AND Linux-man-pages-1-para AND Linux-man-pages-copyleft AND Linux-man-pages-copyleft-2-para AND Linux-man-pages-copyleft-var AND MIT AND Spencer-94
- nixpkgs unstable: man-pages 6.20
- ๐ the page's license: Linux-man-pages-copyleft
- Copyright 1993, Thomas Koenig <ig25@rz.uni-karlsruhe.de>
- ๐ girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms