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。