2

/ 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を再度読み取らずに直接生成する方法があるはずです。 、私が間違っている場合は訂正してください^ _ ^

4

4 に答える 4

1

さて、あなたは以下を使ってプロセスのPIDをつかむことができます:

pid_t pid = getpid();

次に、ファイル/ proc / PID / マップを開いて配列に解析し、どのメモリセットが読み取り/書き込みであるかを判断できます。

編集:getpid()関数には。が必要#include <unistd.h>です。

于 2011-02-17T14:46:14.693 に答える
1

残念ながら、ここでやりたいことを実行するための完全なライブラリは(私の知る限り)ありません。libprocprocpsの一部としてがありますが、これは内部APIであり、さらにおそらくprocpsで使用される機能のみを実装します。そのようなライブラリがあれば確かにいいでしょう-気軽にリリースしてください!-ただし、今のところ、ターゲットとするOSごとに条件付きコンパイルを行い、OS固有のAPI(Linuxの場合は、適切なprocfileを直接開いて読み取る)を直接使用する必要があります。

于 2011-02-17T15:06:51.917 に答える
0

通常のファイルと同じようにprocファイルを読み取ります。

例えば。

  FILE *filep = fopen("/proc/9322/maps","r");
  char ch;
  while (ch != EOF){
    ch = fgetc(filep);
    printf("%c", ch);
  }
于 2011-02-17T14:48:46.273 に答える