> For the complete documentation index, see [llms.txt](https://man.bsdcn.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://man.bsdcn.org/sys/chdir.2.md).

# chdir(2)

`chdir` — 更改当前工作目录

## 名称

`chdir`, `fchdir`

## 库

Lb libc

## 概要

`#include <unistd.h>`

```c
int
chdir(const char *path);

int
fchdir(int fd);
```

## 描述

`path` 参数指向某个目录的路径名。`chdir()` 系统调用使该指定目录成为当前工作目录，即不以斜杠 **`/`** 开头的路径名进行路径查找时的起始点。

`fchdir()` 系统调用使 `fd` 所引用的目录成为当前工作目录，即不以斜杠 **`/`** 开头的路径名进行路径查找时的起始点。

要将某个目录设为当前目录，进程必须对该目录具有执行（搜索）权限。

## 返回值

成功完成时返回值 0；否则返回值 -1，并设置全局变量 `errno` 以指示错误。

## 错误

如果以下一个或多个条件成立，`chdir()` 系统调用将失败，且当前工作目录保持不变：

**\[`ENOTDIR`]** 路径前缀的某个组件不是目录。

**\[`ENAMETOOLONG`]** 路径名的某个组件超过 255 个字符，或整个路径名超过 1023 个字符。

**\[`ENOENT`]** 指定的目录不存在。

**\[`ELOOP`]** 在转换路径名时遇到过多的符号链接。

**\[`EACCES`]** 路径名中任何组件的搜索权限被拒绝。

**\[`EFAULT`]** `path` 参数指向进程所分配地址空间之外。

**\[`EIO`]** 在向文件系统读取或写入时发生 I/O 错误。

**\[`EINTEGRITY`]** 从文件系统读取时检测到数据损坏。

如果以下一个或多个条件成立，`fchdir()` 系统调用将失败，且当前工作目录保持不变：

**\[`EACCES`]** 文件描述符所引用目录的搜索权限被拒绝。

**\[`ENOTDIR`]** 文件描述符未引用目录。

**\[`EBADF`]** `fd` 参数不是有效的文件描述符。

## 参见

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

## 标准

`chdir()` 系统调用预期符合 IEEE Std 1003.1-1990 ("POSIX.1")。

## 历史

`chdir()` 系统调用出现于 Version 1 AT\&T UNIX。`fchdir()` 系统调用出现于 4.2BSD。
