【问题标题】:Purpose of /proc/thread-self?/proc/thread-self 的用途?
【发布时间】:2018-08-23 00:59:48
【问题描述】:

我对 Linux 操作系统编程世界还很陌生。我正在开发一个控制英特尔 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/

每次您使用ll 列出符号链接时,thread-selfself 都会不断变化。但日期和时间仍为上次启动时间。

我稍微挖掘了一下,发现了这个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 正在做什么?还是它们只是毫无意义而被视为“绒毛”而被忽略?

【问题讨论】:

    标签: linux multithreading linux-kernel proc


    【解决方案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/&lt;PID&gt; 下有很多信息。例如,您可以查看/proc/&lt;PID&gt;/fd/* 以查看进程打开了哪些文件描述符。 /proc/&lt;PID&gt;/cmdline 给出了argv 的内容。 /proc/&lt;PID&gt;/status 有一堆信息,包括 uid、gid 和内存使用情况。例如,您可以在调试文件描述符泄漏时插入对 ls -l /proc/self/fd/ 的调用。

    【讨论】:

    • 所以它就像一个echo $$ ls 可以用来找出它自己的PID,但我可以从外面做什么?我想我不会很快使用/proc/self
    猜你喜欢
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 2012-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多