Как найти все адреса памяти для чтения и записи процесса в Linux / UNIX с языком C / C ++? - PullRequest
2 голосов
/ 17 февраля 2011

Через файловую систему / proc, вероятно, можно прочитать сопоставления памяти с помощью / proc / PID_PROCESS / maps, но есть ли какие-либо собственные API, предназначенные для этой функции в C / C ++?

, т. Е. Для поиска памятиадрес, доступный для записи и чтения для процесса с 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 ]

1 голос
/ 17 февраля 2011

К сожалению, нет полной библиотеки (насколько мне известно), чтобы делать то, что вы хотите здесь. Существует libproc как часть procps, однако это внутренний API, и, более того, вероятно, он реализует только те функции, которые используются procps. Было бы неплохо, если бы была такая библиотека - не стесняйтесь ее выпустить! - но сейчас вам придется условно компилировать для каждой целевой ОС и напрямую использовать API-интерфейсы для ОС (для Linux - непосредственное открытие и чтение соответствующих procfile).

1 голос
/ 17 февраля 2011

Ну, вы можете получить PID процесса, используя:

pid_t pid = getpid();

Затем вы можете открыть файл / proc / PID / maps и проанализировать его в массив, чтобы определить, какие наборы памяти предназначены для чтения-записи.

Редактировать: функция getpid () требует #include <unistd.h>.

0 голосов
0 голосов
/ 17 февраля 2011

Читайте файл proc, как вы читаете обычный файл.

например.

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