1

我的任务是实现一个简单版本的pstree(linux 命令),而我对pstree显示的内容和我在/proc/[pid]目录下找到的内容之间的内容感到困惑。在我输入之后pstree,它显示整个进程树的根是systemd,就像这样:

systemd─┬─ECAgent───3*[{ECAgent}]
        ├─EasyMonitor
        ├─ModemManager───2*[{ModemManager}]
        ├─NetworkManager─┬─dhclient

在我尝试读取所有/proc/[pid]/stat文件之后,我得到了以下结果(做一些格式化):

pid  comm       state ppid
1    systemd    S     0
2    kthreadd   S     0
3    rcu_gp     I     2
4    rcu_par_gp I     2

似乎还有另一个过程kthreaddsystemd. 这与pstree命令中显示的不同。

在阅读了一些手册和网络资料后,我知道它pstree显示了所有 runnnig 进程,并且kthreadd是所有相关线程的根线程。但是我仍然很困惑,kthreadd这不算是pstree命令运行的进程。所以kthreadd即使它拥有一个pid(即2)也不是一个进程?我应该kthreadd在我的版本中包含一个正在运行的进程pstree吗?

4

1 回答 1

0

kthreadd 不是由 systemd 启动的进程。Kthreadd 是内核启动的内核地址空间中的工作线程

pstree 更多地与显示父子层次结构的用户空间进程有关。

在我看来,你不应该在你的实现中包含 kthreadd。查找内核线程的方法之一是 /proc/$pid/cmdline 对于内核线程为空。

于 2020-02-26T10:57:40.890 回答