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

mur*_*uru 28 linux symlink proc

如果我启动一个进程然后删除它的二进制文件,我仍然可以从/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
Run Code Online (Sandbox Code Playgroud)

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

cp: cannot stat ‘sleep’: No such file or directory
Run Code Online (Sandbox Code Playgroud)

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

Cel*_*ada 24

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

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

注意,当你ls -l一个/proc/<pid>/exe的过程,其可执行文件已被删除的链接目标具有字符串“(删除)”,在它的结束伪文件。这在符号链接中通常是没有意义的:绝对没有一个文件位于目标路径中,其名称以“(已删除)”结尾。

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


dr_*_*dr_ 5

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

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

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

  • 我很确定内核为您提供了二进制文件的 _inodes_ 内容,而不是其内存中的副本。内存中的副本不可能包含文件的所有部分。另一方面,索引节点是引用计数的,并且在引用存在时不会被覆盖。内核将保留对正在执行的文件的引用,以便在必要时可以加载其他部分。 (2认同)