/proc/ 如何/exe 符号链接与普通符号链接有何不同?

/proc/ 如何/exe 符号链接与普通符号链接有何不同?

如果我启动一个进程然后删除它的二进制文件,我仍然可以从以下位置恢复它/proc/<pid>/exe

$ cp `which sleep` .
$ ./sleep 10m &
[1] 13728
$ rm sleep
$ readlink /proc/13728/exe                           
/tmp/sleep (deleted)
$ cp /proc/13728/exe ./sleep-copy
$ diff sleep-copy `which sleep` && echo not different
not different
$ stat /proc/13728/exe 
  File: ‘/proc/13728/exe’ -> ‘/tmp/sleep (deleted)’
  Size: 0           Blocks: 0          IO Block: 1024   symbolic link

另一方面,如果我自己创建符号链接,请删除目标并尝试复制:

cp: cannot stat ‘sleep’: No such file or directory

/proc是内核的接口。那么这个符号链接实际上是否指向内存中加载的副本,但具有更有用的名称?该链接到底是如何exe工作的?

答案1

/proc/<pid>/exe不遵循符号链接的正常语义。从技术上讲,这可能会被视为违反 POSIX,但/proc毕竟是一个特殊的文件系统。

/proc/<pid>/exe当您使用它时,它似乎是一个符号链接stat。这是内核导出它所知道的进程可执行文件的路径名的便捷方法。但是,当您实际打开该“文件”时,没有读取符号链接以下内容的正常过程。相反,内核只是让您直接访问打开的文件条目。

请注意,当您为其可执行文件已被删除的进程创建伪ls -l文件时/proc/<pid>/exe,符号链接目标的末尾有字符串“(deleted)”。这在符号链接中通常是没有意义的:目标路径中肯定不存在名称以“(已删除)”结尾的文件。

太长了;博士文件系统proc实现只是通过路径名解析来完成它自己的神奇事情。

答案2

根据 /proc 的手册页,在 Linux 2.2 及更高版本下,该文件是一个符号链接,包含所执行命令的实际路径名。显然,二进制文件被加载到内存中,并/proc/[pid]/exe指向二进制文件的内容在记忆中

另一方面,在 Linux 2.0 及更早版本中,/proc/[pid]/exe显然是一个指向文件(在文件系统中)被执行。

因此,如果您在 Linux 2.0 或更早版本上运行相同的命令列表,可能会收到错误“没有这样的文件或目录”。

答案3

中的所有文件/proc都是按需生成的。因此,它们有时的行为与普通文件略有不同。

例如,许多文件/proc在目录列表中显示为大小为 0 的常规文件。然而,当你阅读它们时,它们并不是空的。原因是文件的内容是按需生成的。内容可能会随着时间的推移而变化,甚至可能取决于打开文件的进程。因此,如果不打开文件并读取文件,就无法知道内容的大小。

/proc/<pid>/exe是对内核内部打开的文件描述的引用。无法准确传达打开文件的描述:它是内核内部的数据结构。因此内核以近似的方式表示它:作为文件的符号链接。由于抽象文件系统层维护的信息,内核会记住文件的名称,如果文件被重命名,内核甚至会跟踪该文件。如果文件被删除,内核会记住它所知道的姓氏并将其附加(deleted)到该名称中。作为符号链接目标返回的字符串是在每次进程调用readlink它时动态生成的。在幕后,打开/proc/<pid>/exe快捷方式通常的符号链接解析并直接打开文件描述。这同样适用于/proc/<pid>/fd/<number>/proc/<pid>/cwd/proc/<pid>/root和其他类似链接。

“神奇”符号链接的另一个例子是/proc/self。它是动态生成的,指向/proc/<pid>访问它的进程的目录。

相关内容