如何判断一个进程是否是系统进程?

Mil*_*ari 3 linux process android

我正在阅读/proc目录(或伪文件)以查找所有进程。我正在获取我需要的信息,/proc/[pid]/status但我还需要一些其他信息。有什么方法可以确定哪些进程对系统至关重要?例如使用进程的父 pid 或 UID?

通过系统进程,我的意思是在操作系统的全新安装中以及在安装任何应用程序或服务之前存在的进程。这可能根本不意味着内核线程或系统进程,但总而言之,我的意思是进程,它们的终止破坏系统的基本结构。

附注。我正在开发一个 android 应用程序,但是由于这部分是使用纯 Linux 文件系统完成的,所以我在这里询问了它,我认为不会有任何不同。

iyr*_*rin 5

如果有,htop您可以按Shift+k切换内核线程的显示。如果您按下F5树模式,它们都应该显示为kthreadd.

一个内核线程和用户空间线程之间的一些差异可见:

  • /proc/$pid/cmdline 内核线程为空——这是 ps 和 top 用来区分内核线程的方法。

  • /proc/$pid/exe符号链接没有目标内核线程-这是有道理的,因为他们没有在文件系统中对应的可执行文件。

更具体地说,readlink()系统调用返回ENOENT(“没有这样的文件或目录”),尽管链接本身存在,以表示该进程的可执行文件不存在(并且从未存在)的事实。

因此,检查内核线程一种可靠的方法应该是请readlink()/proc/$pid/exe并检查其返回代码。如果成功,则$pid是用户进程。如果它失败了ENOENT,那么额外的stat()on/proc/$pid/exe应该将内核线程的情况与刚刚终止的进程区分开来。

  • /proc/$pid/status 大多数内核线程缺少几个字段 - 更具体地说是一些与虚拟内存相关的字段。

来自识别内核线程的上述答案

另一种区分内核线程与其他进程的方法是运行top -c. 从top手册:

3.命令 - 命令名称命令行
显示用于启动任务或相关程序的名称命令行。您使用“c”在命令行和名称之间切换,这既是命令行选项又是交互式 com?曼德。

当您选择显示命令行时,没有命令行的进程(如内核线程)将仅显示括号中的程序名称,如下例所示:
[ mdrecoveryd ]

运行ps aux还会显示在方括号中没有命令就启动的进程(并且会有一个空/proc/[pid]/cmdline文件)。

例子:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root        19  0.0  0.0      0     0 ?        S<   Mar02   0:00 [kworker/1:0H] 
Run Code Online (Sandbox Code Playgroud)

请参阅包procps-3.2.8文件/proc/readproc.h

// Basic data structure which holds all information we can get about a process.
// (unless otherwise specified, fields are read from /proc/#/stat)
//
// Most of it comes from task_struct in linux/sched.h
Run Code Online (Sandbox Code Playgroud)