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)
|| /* 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, exceeds size bytes, NULL gets returned and errno is set to ERANGE. 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 โ€” buf points to a bad address.
  • EINVAL โ€” The size argument is zero and buf is not a null pointer.
  • EINVAL โ€” getwd(): buf is NULL.
  • ENAMETOOLONG โ€” getwd(): The size of the null-terminated absolute pathname string exceeds PATH_MAX bytes.
  • ENOENT โ€” The current working directory has been unlinked. she's gone, bestie ๐Ÿ˜ญ
  • ENOMEM โ€” Out of memory. the vibes are bad.
  • ERANGE โ€” The size argument 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. Use getcwd() 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
  • ๐Ÿ’– girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms