我对Linux操作系统编程世界相当陌生。我正在做一个控制英特尔CPU(睿频加速,超线程,最小和最大缩放频率以解决其他用户问题(的项目。在调查 CPU 利用率/proc/stat
时,我偶然发现了这个:
$ ll /proc/thread-self
lrwxrwxrwx 1 root root 0 Aug 22 04:26 /proc/thread-self -> 9389/task/9389/
$ ll /proc/self
lrwxrwxrwx 1 root root 0 Aug 22 04:26 /proc/self -> 29420/
$ ll /proc/self
lrwxrwxrwx 1 root root 0 Aug 22 04:26 /proc/self -> 29636/
$ ll /proc/thread-self
lrwxrwxrwx 1 root root 0 Aug 22 04:26 /proc/thread-self -> 30021/task/30021/
每次列出带有ll
的符号链接时,thread-self
和self
都会不断变化。但是,日期和时间仍为上次启动时间。
我做了一些挖掘,在 2014 年发现了这个电子邮件链:
此修补程序集实现了
/proc/thread-self
魔术符号链接,用于解决 几个问题。
....电子邮件的下方说:
proc: Have net show up under /proc/<tgid>/task/<tid> proc: Implement /proc/thread-self to point at the directory of the current thread proc: Point /proc/net at /proc/thread-self/net instead of /proc/self/net proc: Point /proc/mounts at /proc/thread-self/mounts instead of /proc/self/mounts
dp符号链接如何工作?或者我们如何使用它们来有意义地分析/显示 Linux 正在做什么?还是它们只是毫无意义,被忽略为"绒毛"?
/proc/self
是指向当前进程的符号链接,即示例中ls
进程。由于每个ll
都会生成一个具有不同 PID 的新ls
进程,因此符号链接每次都会更改。它是一个神奇的符号链接,会根据访问它的进程而变化。不同的进程将看到不同的目的地。
/proc/thread-self
是一回事,只是它指向当前线程而不是当前进程。在您显示的输出中,ls
正在其主(也可能是唯一(线程上查找符号链接,因此线程 ID 与进程 ID 匹配。
如果你检查mount
或cat /proc/mounts
的输出,你会看到这个"魔术"是如何实现的。/proc
通常作为虚拟文件系统挂载。
$ mount | grep proc
proc on /proc type proc (rw)
每当您访问/proc
下的条目时,proc
文件系统都会处理查找。与ext4
、xfs
或tmpfs
等标准文件系统相比,磁盘上没有底层文件集。相反,有一个内核级驱动程序来处理所有文件系统调用。当您访问/proc/self
内核驱动程序会检查发出请求的进程,并动态地创建指向该进程 PID 的符号链接。
它有什么用?好吧,/proc/<PID>
下有很多信息.例如,您可以在/proc/<PID>/fd/*
中查看进程打开了哪些文件描述符。/proc/<PID>/cmdline
给出了argv
的内容。/proc/<PID>/status
有一堆信息,包括 uid、gid 和内存使用情况。例如,您可以在调试文件描述符泄漏时插入对ls -l /proc/self/fd/
的调用。