我对Linux OS编程世界还很陌生。我正在一个项目中控制英特尔CPU(涡轮增压,超线程,最小和最大缩放频率以解决其他用户的问题)。在调查/proc/stat
的CPU使用率时,我偶然发现了这一点:
$ 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/
每次您用thread-self
列出符号链接时, self
和ll
都会不断变化。日期和时间仍然是最后一次引导时间。
我做了一些挖掘,发现了这个email chain in 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所做的事情进行有意义的分析/显示?还是它们只是毫无意义而被视为“绒毛”?
答案 0 :(得分:1)
/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
filesystem都会处理查找。与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/
的调用。