我正在阅读《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
。这些命令调用诸如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
a 的成员fs_struct
所指向的fs
a 的成员中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
.