---
name: "chdir"
section: "2"
platform: "macos"
package: "xnu"
version: "12377.121.6"
release: "macOS 26.5"
platforms: ["linux", "freebsd", "macos"]
url: "https://new.carta.tech/chdir/2"
---

# chdir(2)

change current working directory

## NAME

**chdir**, **fchdir** – change current working directory

## SYNOPSIS

**#include \<unistd.h\>**

*int*\

**chdir**(*const char \*path*);

*int*\

**fchdir**(*int fildes*);

## DESCRIPTION

The *path* argument points to the pathname of a directory. The **chdir**() function causes the named directory to become the current working directory, that is, the starting point for path searches of pathnames not beginning with a slash, ‘/’.

The **fchdir**() function causes the directory referenced by *fildes* to become the current working directory, the starting point for path searches of pathnames not beginning with a slash, ‘/’.

In order for a directory to become the current directory, a process must have execute (search) access to the directory.

## RETURN VALUES

Upon successful completion, a value of 0 is returned. Otherwise, a value of -1 is returned and *errno* is set to indicate the error.

## ERRORS

The **chdir**() system call will fail and the current working directory will be unchanged if one or more of the following are true:

- \[EACCES\]

  Search permission is denied for any component of the path name.

- \[EFAULT\]

  *Path* points outside the process's allocated address space.

- \[EIO\]

  An I/O error occurred while reading from or writing to the file system.

- \[ELOOP\]

  Too many symbolic links were encountered in translating the pathname. This is taken to be indicative of a looping symbolic link.

- \[ENAMETOOLONG\]

  A component of a pathname exceeded  {NAME\_MAX} characters, or an entire path name exceeded  {PATH\_MAX} characters.

- \[ENOENT\]

  The named directory does not exist.

- \[ENOTDIR\]

  A component of the path prefix is not a directory.

**fchdir**() will fail and the current working directory will be unchanged if one or more of the following are true:

- \[EACCES\]

  Search permission is denied for the directory referenced by the file descriptor.

- \[EBADF\]

  The argument *fildes* is not a valid file descriptor.

- \[EINTR\]

  **fchdir**() was interrupted by a signal.

- \[EIO\]

  An I/O error occurred while reading from or writing to the file system.

- \[ENOTDIR\]

  The file descriptor does not reference a directory.

## SEE ALSO

[chroot(2)](/chroot/2.md)

## STANDARDS

The  **chdir**() is expected to conform to  IEEE Std 1003.1-1988 (“POSIX.1”).

## HISTORY

The **fchdir**() function call appeared in 4.2BSD.
