是否可以直接从Linux内核查询进程信息?

是否可以直接从Linux内核查询进程信息?

我知道pgreptopps所有查询/proc文件系统。到目前为止,一切都很好。然而让我想到的是过去没有/proc文件系统。即使现在,据我所知,Mac OS X 没有/proc文件系统,但top仍然访问进程信息,这表明这些信息应该直接来自内核。然而,我的问题是针对 Linux 的。哪些库和/或系统调用可用于绕过直接查询进程信息/proc

答案1

可以直接从 Linux 内核查询进程信息——通过读取/proc.这是在 Linux、Solaris 和其他几个 Unix 变体上完成的方式。

古代 Unix 系统有一个ps命令是 setuid root 并映射一些内核内存(通过/dev/kmem或类似)和解析的内核数据结构。这需要ps拥有特权(危险)并与确切的内核版本绑定(不方便)。

在现代 *BSD 系统上,ps通过调用sysctl函数,进而进行系统调用来检索格式化为二进制格式定义的结构的信息。 MacOS 使用相同的机制。

Linux 没有这个 BSD 接口。它使用 procfs 和 sysfs 来允许用户态从内核检索信息。 BSD 将信息编组为由专用系统调用检索的二进制格式,而 Linux 将信息编组为通过对专用文件系统的普通文件访问检索的字符串。可以使用与古代 Unix 系统中相同的方法,但没有人这样做,因为这是一种低劣的方法(需要特权并且需要在内核数据结构发生变化时进行更新)。

答案2

在 /proc 文件系统出现之前,psutils 直接通过 /dev/kmem(内核内存伪设备)读取信息。显然,只有某些版本的 ps 可以与任何给定的内核版本一起使用,这是支持 /proc 的一个论点。 (人类可读,并且更容易访问 Perl 脚本等内核结构可以说是更大的好处。)

相关内容