每个进程都有一个当前目录是什么意思?


10

我正在阅读“ Unix编程环境”,但我不理解当前的进程目录

每个进程都有一个当前目录,除非所有文件名都直接以斜杠开头,否则所有文件名都隐式假定以该目录的名称开头。

这是否意味着每个进程都有一个在其创建目录中的标志?例如,如果/bin/sed从中调用了program /home/rene,则通过调用sed创建的进程具有当前目录/home/rene

Answers:


13

概念层面

从外壳启动进程时,该进程的当前工作目录与外壳的当前工作目录相同。在外壳程序上下文中,当前工作目录是您当前“所在”的位置。

任何进程的当前工作目录都用于解释相对路径。例如,如果您的外壳程序的当前工作目录为,/home/rene并且您是ls ..从外壳程序运行的,则该进程的当前工作目录/home/rene将用于解析../home

您可以查看系统上运行的所有进程的当前工作目录lsof | grep '\scwd\s'(请注意,您可能需要以root用户身份才能查看其他用户的进程。)这可以使您了解当前工作目录如何与在系统上运行的进程。

程序级别

Shell的当前工作目录是您分别使用Shell内置插件pwdcd分别查看和修改的目录。这些命令调用诸如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关联。

chdirgetcwd系统调用修改和检索信息pwd


此外,对于内核级别,记住进行系统调用时,还有一个指向“当前” task_struct的指针很有用-因此,代码“代表”当前进程执行。fs_struct可以通过指针到当前的task_struct来访问:elixir.free-electrons.com/linux/v4.12.4/source/fs/...
德米特里S.

1

每个进程在启动时都有一个当前的工作目录(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

参考文献

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.