/ proc / <pid> / exe符号链接与普通符号链接有何不同?


23

如果我启动一个进程,然后删除它的二进制文件,我仍然可以从中恢复它/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链接是如何工作的?

Answers:


19

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

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

请注意,当您为已删除可执行文件的进程ls -l创建/proc/<pid>/exe伪文件时,符号链接目标的末尾带有字符串“(已删除)”。在符号链接中,这通常是毫无意义的:绝对不存在以“(已删除)”结尾的文件,该文件位于目标路径中。

TL;博士proc文件系统实现只是做了自己的神奇的事情与路径名解析。


1
和魔术家住proc_exe_link()proc文件系统:lxr.free-electrons.com/source/fs/proc/base.c?v=4.0#L1350
斯蒂芬·基特

您怎么知道绝对没有这样的文件名?可能有人创造了一个实验。我以前做过一次。它不太可能由于其他任何原因而存在,但仍然并非不可能。
flarn2006 '18

4

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

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

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


哪个手册页?linux.die.net/man/5/procmanpages.ubuntu.com/manpages/utopic/en/man5/proc.5.html说“尝试打开它会打开可执行文件”,但没有说它在哪里来自。
muru 2015年

1
我很确定内核会为您提供二进制文件的inode内容,而不是内存中的副本。内存中的副本不太可能包含文件的所有部分。另一方面,索引节点是按引用计数的,在存在引用的情况下不会被覆盖。内核将保留对执行文件的引用,以便在必要时可以加载其他部分。
2016年
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.