【问题标题】:How to find all read-write memory address of a process in Linux/UNIX with C/C++ language?如何使用 C/C++ 语言查找 Linux/UNIX 中进程的所有读写内存地址?
【发布时间】:2011-06-29 03:46:33
【问题描述】:

通过 /proc 文件系统,可以通过 /proc/PID_PROCESS/maps 读取内存映射,但是在 C/C++ 中是否有专门用于此功能的原生 API?

即找出对于 PID 9322 的进程可写和可读的内存地址:

%> awk -F "-| " '$3 ~ /rw/ { print $1 " " $2}' /proc/9322/maps
0804e000 0804f000
085ed000 0860e000
b7707000 b7708000
b7864000 b7865000
b7865000 b7868000
b7897000 b7898000
b78b6000 b78b7000
bfd2e000 bfd50000

这些地址被传递到我的程序中,但现在我想将此函数直接集成到我的 C++ 程序中。

为了最有效,如果我想支持其他 *BSD 系统,我将无法利用 /proc 系统,我认为应该有一些方法可以直接生成 /proc/1/maps 而无需阅读他们又在那里,如果我错了,请纠正^_^

【问题讨论】:

    标签: c++ linux memory mapping procfs


    【解决方案1】:

    好吧,您可以使用以下方法获取进程的 PID:

    pid_t pid = getpid();
    

    然后,您可以打开文件 /proc/PID/maps to 并将其解析为数组以确定哪些内存集是可读写的。

    编辑:getpid() 函数需要#include <unistd.h>。

    【讨论】:

      【解决方案2】:

      不幸的是,没有完整的图书馆(据我所知)在这里做你想做的事。 libproc 作为 procps 的一部分,但这是一个内部 API,而且可能只实现 procps 使用的功能。如果有这样的库当然会很好 - 随意发布一个! - 但现在你必须为你所针对的每个操作系统进行条件编译,并直接使用操作系统特定的 API(对于 Linux,直接打开和读取适当的 procfiles)。

      【讨论】:

      • 感谢您回答这个问题,我并没有真正尝试过 libproc,但您是对的,我应该尝试发布一个;-P
      【解决方案3】:

      像阅读普通文件一样阅读 proc 文件。

      例如。

        FILE *filep = fopen("/proc/9322/maps","r");
        char ch;
        while (ch != EOF){
          ch = fgetc(filep);
          printf("%c", ch);
        }
      

      【讨论】:

      • 谢谢 Zim,但有没有我不需要解析 /proc 文件系统的本地 API?因为在某些 BSD UNIX 系统上,没有 /proc 文件系统,如果我的程序在大多数 *BSD 系统中是可移植的,我会很高兴;-P
      • AFAIK 没有本地 API。您可以为每个 BSD、Linux 编写解析器并使用标志选择性地编译。
      • 当然,我已经用简单的文件读取和解析实现了一个,我现在将这个作为最佳答案。
      【解决方案4】:
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      • 2013-08-09
      • 1970-01-01
      相关资源
      最近更新 更多