linux中cwd是current working directory的缩写,中文译为当前工作目录,指的是进程当前所在的目录位置,所有相对路径的文件操作都会基于这个目录来解析。每个运行中的进程都有自己独立的cwd,默认情况下继承自父进程的cwd,也可以通过特定操作修改。

cwd的核心特性
cwd是进程运行时的重要属性,主要有以下几个特点:
- 每个进程都有独立的cwd,不同进程的cwd可以完全不同
- 相对路径的文件读写、执行操作都会以cwd作为基准目录
- 进程的cwd可以通过系统调用或者命令进行修改
- 当进程启动时,cwd默认继承自启动它的父进程的cwd
查看进程的cwd
在linux中可以通过多种方式查看进程的cwd,以下是常用的几种方法:
1. 通过/proc文件系统查看
linux的/proc目录下每个进程都有对应的以进程ID命名的目录,其中的cwd文件是一个符号链接,指向该进程的当前工作目录。我们可以通过ls -l命令查看这个链接的指向。
比如查看进程ID为1234的进程的cwd,执行以下命令:
# 查看进程1234的cwd指向 ls -l /proc/1234/cwd
执行后会输出类似lrwxrwxrwx 1 user user 0 1月 1 00:00 /proc/1234/cwd -> /home/user/test的内容,箭头后面的路径就是该进程的cwd。
2. 使用pwd命令查看当前shell的cwd
如果是在当前shell中查看自身的cwd,直接使用pwd命令即可,该命令会输出当前shell进程的当前工作目录的绝对路径。
# 查看当前shell的cwd pwd
修改进程的cwd
进程可以通过系统调用修改自身的cwd,在命令行中也可以通过cd命令修改当前shell的cwd。
1. 命令行修改cwd
使用cd命令可以切换当前shell的cwd,后面跟上目标目录的路径即可,支持相对路径和绝对路径。
# 切换到/home/user/documents目录,修改当前cwd cd /home/user/documents # 切换到上级目录 cd .. # 切换到当前用户的家目录 cd ~
2. 编程中修改cwd
在C语言编程中,可以使用chdir函数修改进程的cwd,该函数需要传入目标目录的路径作为参数,返回0表示修改成功,返回-1表示失败。
#include <unistd.h>
#include <stdio.h>
int main() {
// 修改当前进程的cwd为/tmp目录
int ret = chdir("/tmp");
if (ret == 0) {
printf("修改cwd成功n");
// 再次查看当前cwd
char buffer[1024];
getcwd(buffer, sizeof(buffer));
printf("当前cwd是:%sn", buffer);
} else {
printf("修改cwd失败n");
}
return 0;
}
cwd的实际应用场景
cwd在linux系统使用和编程中有很多实际的应用场景:
- 执行相对路径的程序时,程序路径是相对于当前cwd解析的,比如当前cwd是/home/user,执行
./test.sh会执行/home/user/test.sh - 排查进程问题时,可以通过查看进程的cwd确认进程的工作目录,判断文件路径相关的问题
- 编写脚本或程序时,如果需要操作相对路径的文件,需要明确当前的cwd,避免路径解析错误
- 多进程协作时,不同进程可以设置不同的cwd,实现各自独立的文件操作空间
常见问题说明
很多用户会混淆cwd和根目录的概念,cwd是进程当前所在的目录,而根目录是进程可见的文件系统的顶层目录,默认情况下进程的根目录是系统的根目录/,也可以通过chroot命令修改进程的根目录。另外,删除进程的cwd目录后,进程的cwd仍然会指向原来的路径,只是该路径已经不存在,此时如果进行相对路径操作可能会失败。