/ proc / thread-self的目的?

时间:2018-08-23 00:59:48

标签: linux multithreading linux-kernel proc

我对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列出符号链接时,

selfll都会不断变化。日期和时间仍然是最后一次引导时间。

我做了一些挖掘,发现了这个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所做的事情进行有意义的分析/显示?还是它们只是毫无意义而被视为“绒毛”?

1 个答案:

答案 0 :(得分:1)

/proc/self是当前流程的符号链接,在您的示例中为ls流程。由于每个ll都会使用不同的PID生成新的ls进程,因此符号链接每次都会更改。这是一个魔术符号链接,它会根据访问它的进程而改变。不同的进程将看到不同的目的地。

/proc/thread-self是同一件事,除了它指向当前线程而不是当前进程。在显示的输出中,ls正在其主线程(并且可能仅)上查找符号链接,因此线程ID与进程ID匹配。

如果检查mountcat /proc/mounts的输出,您将看到如何实现这种“魔术”。 /proc通常作为虚拟文件系统挂载。

$ mount | grep proc
proc on /proc type proc (rw)

每次访问/proc下的条目时,proc filesystem都会处理查找。与ext4xfstmpfs之类的标准文件系统相比,磁盘上没有底层文件集。相反,有一个内核级驱动程序可以处理所有文件系统调用。当您访问/proc/self时,内核驱动程序将检查哪个进程正在发出请求,并动态生成指向该进程的PID的符号链接。

有什么用?好吧,/proc/<PID>下有很多信息。例如,您可以在/proc/<PID>/fd/*中查看进程打开了哪些文件描述符。 /proc/<PID>/cmdline给出argv的内容。 /proc/<PID>/status有很多信息,包括uid,gid和内存使用情况。例如,您可能在调试文件描述符泄漏时插入对ls -l /proc/self/fd/的调用。