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

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

我正在阅读《Unix 编程环境》,但我不理解这个概念当前目录的过程。

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

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

答案1

概念层面

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

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

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

节目级别

shell 的当前工作目录是您分别使用 shell 内置命令pwd和看到和修改的目录cd。这些命令调用诸如getcwdchdir之类的系统调用,这些系统调用与 shell 的当前工作目录一起工作。

bash个例子,cd内置函数最终运行此行:

if (chdir (nolinks ? newdir : tdir) == 0)

内置程序pwd最终运行此行:

the_current_working_directory = getcwd (0, PATH_MAX);

shell 只是当前工作目录使用的一个方便示例;其他程序也使用这些相同的系统调用。程序可以将其当前工作目录更改为,/usr程序使用的任何相对路径都将从该/usr目录开始,

内核级

进程的当前工作目录由内核存储。 Linux 将其存储在pwda 的成员fs_struct所指向的fsa 的成员中task_struct。该pwd成员是一个path结构体,它指向有关挂载 ( vfsmount) 和目录在文件系统 ( dentry) 中的位置的信息。每个进程都有一个task_struct与之相关的进程。

chdir和系统getcwd调用修改和检索 中的信息pwd

答案2

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

参考

相关内容