如何从C程序中获取有关进程内存的信息?

如何从C程序中获取有关进程内存的信息?

我必须获取进程的内存使用信息。我知道它可以在/proc/${pid}/statm但是否有系统功能来获取它。解析文件似乎效率很低。

答案1

您错误地认为解析文件似乎效率低下,因为您断章取义。您可能已经知道下面的信息/proc仅在您请求时“创建”,并且不是每当有变化时都会更新。因此,您不仅必须解析它,内核还必须将其生成为文本。

直接将几个字节读入 long 当然比调用atoi()字符串更有效。但您必须将其视为必须执行系统调用的上下文的一部分。为读取某些文件内容(或调用内核可能提供的某些二进制 API)而执行的所有额外代码都会使字符串转换所需的时间相形见绌。

内核进程比普通程序更频繁地需要此类数据,因此没有必须执行系统调用来获取此类数据的开销,并且它们可以直接访问此类数据。

答案2

你没有提到你想获得什么样的信息,但Linux重新实现了pmap <pid>Solaris的命令。它不打印完全相同的信息,但输出是可比的。您可能想检查 Linux 是否从 Solaris 的各种 p* 命令中重新实现了更多内容。有趣的psig是 Linux 不支持。

出于安全原因,UNIX 上的特定信息仅对进程本身可用,超出此范围的信息是有限的,通常仅适用于ps类似的程序。

请注意,一般的 UNIX 哲学是通过函数提供特殊信息ioctl(),这就是/proc20 世纪 80 年代末首次实现的工作原理。每个进程都是 /proc 中的一个文件,只有 ioctl 对该文件起作用。请注意,在引入 /proc 之前,UNIX 用户被迫自由读取内核内存以获取特殊信息,并且由于没有锁,因此当相关进程死亡或被换出时,这可能会导致垃圾。

1980 年,UNOS(第一个 UNIX 克隆)为 ps 命令实现了 getpsinfo() 系统调用。/proc可以看作是抽象视图的更好实现。

大约在 90 年代中期,procfs-2 定义了一个进程,使其成为一个目录和其中的文件,允许读取复杂的二进制数据(例如,用于/proc/<pid>/as地址空间文件)。该目录内的其他文件具有可以的结构化二进制数据(定义的 C 结构)read()(例如,/proc/<pid>/usage用于资源使用)。

Linux不兼容procfs和procfs2文件,路径名不同,文件内容不同。/proc/<pid>/fd/on Linux 与 AT&T procfs2 论文存在明显冲突。

相关内容