Answers:
概念层面
从外壳启动进程时,该进程的当前工作目录与外壳的当前工作目录相同。在外壳程序上下文中,当前工作目录是您当前“所在”的位置。
任何进程的当前工作目录都用于解释相对路径。例如,如果您的外壳程序的当前工作目录为,/home/rene
并且您是ls ..
从外壳程序运行的,则该进程的当前工作目录/home/rene
将用于解析..
为/home
。
您可以查看系统上运行的所有进程的当前工作目录lsof | grep '\scwd\s'
(请注意,您可能需要以root用户身份才能查看其他用户的进程。)这可以使您了解当前工作目录如何与在系统上运行的进程。
程序级别
Shell的当前工作目录是您分别使用Shell内置插件pwd
和cd
分别查看和修改的目录。这些命令调用诸如getcwd
和的系统调用,这些调用chdir
与Shell的当前工作目录一起使用。
使用bash
作为一个例子,cd
内置的最终运行这一行:
if (chdir (nolinks ? newdir : tdir) == 0)
而pwd
内置的最终运行这一行:
the_current_working_directory = getcwd (0, PATH_MAX);
Shell只是当前工作目录使用的一个方便示例;这些相同的系统调用也被其他程序使用。程序可以将其当前工作目录更改为/usr
,并且程序使用的任何相对路径都将从该/usr
目录开始,
内核级别
进程的当前工作目录由内核存储。Linux将其存储在的pwd
成员fs_struct
指向的的fs
成员中task_struct
。该pwd
成员是一个path
结构,它指向有关mount(vfsmount
)和目录在文件系统(dentry
)中的位置的信息。每个进程都有一个task_struct
关联。
该chdir
和getcwd
系统调用修改和检索信息pwd
。
每个进程在启动时都有一个当前的工作目录(CWD)。您可以执行以下操作找到进程的工作目录。
运行ps aux找出进程的PID:
$ pgrep cupsd
24532
找出PID的当前工作目录:24532
$ sudo pwdx 24532
24532: /
因此进程(PID:24532)的CWD为/
。
这是另一个例子:
$ sleep 1000 &
[1] 15988
$ pwdx 15988
15988: /home/sam
这次睡眠过程(PID:15988)将CWD设置为我的主目录/home/sam
。
您还可以运行以下ls -l
命令:
$ sudo ls -l /proc/24532/cwd
lrwxrwxrwx 1 root root 0 Apr 30 19:18 /proc/24532/cwd -> /
-要么-
$ ls -l /proc/15988/cwd
lrwxrwxrwx 1 sam sam 0 Apr 30 19:23 /proc/15988/cwd -> /home/sam
在这里,您可以再次看到这些过程的CWD,/
以及/home/sam
。